块级同步

Mad*_*dan 5 java synchronization

传递给synchronized的参数有什么意义?

synchronized ( parameter )
{

}
Run Code Online (Sandbox Code Playgroud)

实现块级同步.在某处,我看到了代码

class test
{
    public static final int lock =1;

    ...

    synchronized(lock){
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白这段代码的目的.

谁能给我一个更好的例子和/或解释它?

Jon*_*eet 12

这是锁定的参考.基本上两个线程不会同时执行使用相同引用同步的代码块.正如Cletus所说,同步方法大多等同于synchronized (this)在方法内部使用.

我非常希望你看到的示例代码是不是喜欢那个-你想在一个原始变量同步.同步仅适用于监视器(通过引用) - 即使它合法代码,x也会被装箱,这将导致一些非常奇怪的行为,因为一些整数将总是被装箱到相同的引用,而其他整数将创建一个新的每次你装箱时对象.幸运的是,Java编译器意识到这是一个非常糟糕的主意,并且会为您发布的代码提供编译时错误.

更合理的代码是:

class Test
{
    private static final Object lock = new Object();

    ...

    synchronized(lock){
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我已将锁定为私有,并将其类型更改为Object.它是否应该是静态的取决于具体情况 - 如果你想从多个线程访问/更改静态数据,通常会使用静态变量; 当您想要从多个线程访问/更改每个实例数据时,实例变量通常用于锁定.


cle*_*tus 7

这个:

public synchronized void blah() {
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

在语义上等同于:

public void blah() {
  synchronized (this) {
    // do stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

有些人不喜欢使用'this'进行同步,部分原因是因为它是公共的(因为实例对外部代码是可见的).这就是为什么你最终会使用私人锁的人:

public class Foo
  private final static String LOCK = new String("LOCK");

  public void blah() {
    synchronized (LOCK) {
      // do stuff
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

好处是LOCK在类外是不可见的,你可以创建几个锁来处理更精细的锁定情况.