同步在 Java 中的工作原理是什么?

2022-09-02 13:37:54

我对Java同步有疑问。我想知道我的类中是否有三个Synced方法,并且一个线程在一个同步方法中获取锁定,另外两个将被锁定?我问这个问题是因为我对以下陈述感到困惑。

当线程位于对象的同步方法内部时,希望执行此同步方法或对象的任何其他同步方法的所有其他线程都必须等待。此限制不适用于已具有锁定并正在执行对象的同步方法的线程。此方法可以调用对象的其他同步方法而不会被阻止。对象的非同步方法当然可以随时由任何线程调用


答案 1

Java 中的同步是通过在某个特定对象上获取监视器来完成的。因此,如果您这样做:

class TestClass {
    SomeClass someVariable;

    public void myMethod () {
        synchronized (someVariable) {
            ...
        }
    }

    public void myOtherMethod() {
        synchronized (someVariable) {
            ...
        }
    }
}

然后,这两个块将随时通过执行2个不同的线程来保护,而不会被修改。基本上,据说这两个块是根据变量同步的。someVariablesomeVariable

当你把方法放上去的时候,它的意思基本上和 相同,也就是说,在执行这个方法的对象上进行同步。synchronizedsynchronized (this)

那是:

public synchronized void myMethod() {
    ...
}

表示与:

public void myMethod() {
    synchronized (this) {
       ...
    }
}

因此,为了回答您的问题 - 是的,线程将无法在不同的线程中同时调用这些方法,因为它们都持有对同一监视器(对象的监视器)的引用。this


答案 2

是的。
要执行同步方法线程需要获取对象锁定,并且一次只能有一个线程获得对象锁定。


推荐