繁体   English   中英

Java - 同步块的工作方式与方法不同

[英]Java - Synchronized block works differently than method

我想弄清楚,同步块和同步函数之间的区别实际上是什么。 本规范运作完美,因为它避免了关键部分的错误

class ThreadSynchronous extends Thread {
static int m_count = 0;
String s;

ThreadSynchronous(String s) {
    this.s = s;
}

public void run() {
    synchronized (getClass()) {
        ...
    }
}
}

public class ThreadExample {
public static void main(String[] args) {
    Thread t1 = new ThreadSynchronous("Thread1: ");
    Thread t2 = new ThreadSynchronous("Thread2: ");
    t1.start();
    t2.start();

    try{
        t1.join();
        t2.join();
    } catch (InterruptedException e){
    }
}
}

但是如果我使用public synchronized void run()代替它,它就无法正常/正常工作。

根据JLS 8.4.3.6。 同步方法

同步方法在执行之前获取监视器(第17.1节)。

对于类(静态)方法,使用与方法类的Class对象关联的监视器。

对于实例方法,使用与此关联的监视器(调用该方法的对象)。

synchronized (getClass())块中,您在Class对象上进行同步,因此所有ThreadSynchronous实例都被序列化。

使实例方法 synchronized ,仅在该实例上进行同步( this引用)。

两者在不同的对象上同步。

synchronized (getClass()) { ... }在类上同步,因此在两个Thread实例中,一次只能有一个进入块。

另一方面, public synchronized void run() { ... }在实例上同步,因此两个实例都可以并行进入块。 只有当多个线程共享一个实例时,该块才允许其中只有一个执行。

同步方法在实例上为普通实例方法同步,在静态方法的类对象上同步。

因此,如果您的run()方法可以重构为静态方法,那么synchronized方法关键字将为您提供synchronized (getClass()) { ... }行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM