java - Java中同步块(synchronized block)的简化

标签 java multithreading synchronized synchronized-block

我在理解 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/

相关文章:

java - 安卓:java.lang.IllegalStateException:已经连接

C++ 互斥量和函数参数

java - 如何在缓存中同步文件创建(不写入文件,只是创建)

objective-c - @synchronized 在静态方法中

java - 线程同步,使用notifyAll()

java - 为什么使用 ThreadPoolExecutor 的子线程不能暴露给父线程的任何继承上下文?

java - 并发轮询下游依赖并等待全部成功

java - Windows中执行计划任务时如何隐藏svchost.exe(dos提示符)

java - 是否有java线程中断异步队列并放入alertable?

multithreading - 解析多线程make的输出(-j N)