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.它是否应该是静态的取决于具体情况 - 如果你想从多个线程访问/更改静态数据,通常会使用静态变量; 当您想要从多个线程访问/更改每个实例数据时,实例变量通常用于锁定.
这个:
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在类外是不可见的,你可以创建几个锁来处理更精细的锁定情况.
| 归档时间: |
|
| 查看次数: |
9904 次 |
| 最近记录: |