我在理解 Java 中同步块(synchronized block)的概念时遇到了一些困难。我觉得我已经足够了解同步方法了。所以我想到了一个类比来帮助我从同步方法的角度理解同步块(synchronized block)。请告诉我我提出的这个等价是否正确。另外,我现在只针对非静态同步块(synchronized block)提到了这一点。然而,静态同步块(synchronized block)上的点也受欢迎。
public void method()
{
//code snipppet A
synchronized(objRef)
{
//code snipppet B
}
//code snipppet C
}
相当于
public void method() {
//code snippet A
objRef.sync_method();
//code snippet C
}
在objRef类中:
public synchronized void sync_method() {
//code snippet B
}
这个类比基于同步块(synchronized block)的行为与同步方法一样的逻辑。这意味着一旦一个线程获得了监视器上的锁,它就不允许其他线程干扰其执行。线程仅在执行完整个同步方法后才放弃控制。
最佳答案
您可能没有把所有事情都做好。例如,
synchronized(objRef) {
objRef.nonsync_method();
... more code ...
}
不等于
objRef.sync_method();
因为在前一种情况下,锁覆盖了大部分代码。之间存在等价
synchronized void sync_method() {
// stuff
}
和
void nonsync_method() {
synchronized (this) {
// stuff
}
}
此外,
once a thread acquires a lock on the monitor, it does not allow other threads to interfere in its execution
上述内容可能属实,也可能不属实,取决于我们如何解释含糊的措辞。获得锁的线程可能很容易允许其他线程干扰其执行:所需要的只是另一段未被完全相同的锁覆盖的代码。例如,
int i;
synchronized void sync_method() {
i = 0;
System.out.println(i);
}
void nonsync_method() {
i = 42;
}
调用sync_method()
可以打印0和42。
关于java - Java中同步块(synchronized block)的简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329531/