同步如何在Java中工作?

Raj*_*Raj 17 java thread-synchronization

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

当一个线程在一个对象的synchronized方法中时,所有其他希望执行这个synchronized方法或该对象的任何其他同步方法的线程都必须等待.此限制不适用于已具有锁定并正在执行对象的同步方法的线程.这种方法可以调用对象的其他同步方法而不会被阻塞.当然,任何线程都可以随时调用对象的非同步方法

bez*_*max 16

java中的同步是通过在某个特定对象上监视监视器来完成的.因此,如果你这样做:

class TestClass {
    SomeClass someVariable;

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

    public void myOtherMethod() {
        synchronized (someVariable) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,这两个块将在任何时候通过执行2个不同的线程来保护,而someVariable不会被修改.基本上,据说这两个块与变量同步someVariable.

当你synchronized使用该方法时,它基本上意味着与synchronized (this)执行此方法的对象上的同步相同.

那是:

public synchronized void myMethod() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

意思相同:

public void myMethod() {
    synchronized (this) {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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