synchronized关键字

发布时间 2023-09-04 11:51:52作者: 星流残阳

synchronized

方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前。一次只能有一个线程进入该方法,其他线程想要调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。

public synchronized void func(){
  // TODO
}

对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块。

public void func(){
  synchronized(a1) {
    //一次只能有一个线程进入
  }
}

synchronized后面括号里是一对象,此时,线程获得的是对象锁。但直接对变量上锁是非常粗糙的行为,最好使用虚拟锁替代。

MyMemberClass x, y;
Object xlock = new Object(), ylock = new Object();

public void foo() {
  synchronized(xlock) {
    //access x here
  }
  //do something here - but don't use shared resources
  synchronized(ylock) {
    //access y here
  }
}

public void bar() {
  synchronized(this) {
    //access both x and y here
  }
  //do something here - but don't use shared resources
}

synchronized后面括号的对象为类,此时加锁的为此类,其他线程所有对类进行的操作皆不可行,包括静态变量和静态方法。

synchronized(ArrayWithLockOrder.class) {
  //TODO
}