同步如何在Java中工作?

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

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

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

class TestClass { SomeClass someVariable; public void myMethod () { synchronized (someVariable) { ... } } public void myOtherMethod() { synchronized (someVariable) { ... } } } 

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

当你对方法进行synchronized时,它基本上与synchronized (this)相同,即在对象上执行此方法的同步。

那是:

 public synchronized void myMethod() { ... } 

意思相同:

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

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

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

每个java对象(类实例)都有一个互斥对象。 方法前面的synchronized关键字意味着正在运行的线程必须锁定该对象的互斥锁。 事实上,

 public synchronized doSomething(){ ... } 

与此完全相同:

 public doSomething(){ synchronized(this){ ... } } 

所以是的,每个类实例只有一个线程执行一个synchronized方法。

请注意,有时这可能不是最理想的,因为您希望保护修改,但对于并发读取没有问题,在这种情况下,您可能需要查看ReadWriteLock而不是synchronized关键字。

好吧,每个对象只有一个锁。 并且所有同步方法都被此锁定锁定。 因此,无论哪个线程一次获取锁定,它都有权通过所有同步方法。 但是等待锁定的线程在获得锁定之前无法进入同步方法。

所以一次只有线程规则和其他人必须等待进入任何同步方法,无论裁决线程是否正在执行该方法。

是的,除了获得锁定的线程之外的所有线程都必须等到锁定再次释放才能执行三个同步方法中的一个。

请记住,synchronized方法与包围的常规方法相同

 synchronized(this) { // method body } 

这是真的,它确实以这种方式。 同样有必要使该对象的数据保持一致。

假设这个validation不存在,并且存在一个变量x,它由2个不同的同步方法xxx()和yyy(​​)操纵。

所以如果线程A得到方法xxx()的锁定,它操纵x = 5,第二个线程B得到方法yyy()的锁定并操纵x = -5所以在方法xxx()的末尾,线程A期望x = 5但它会得到x = 0这是错误的。

这就是为什么它以这种方式实施。

如果一个类有4个同步方法,那么一次只有一个线程可以访问这些方法。 我猜这里有疑问,每个线程可以一次访问diff同步方法,用于单个类实例。 答案是不。 一次只有一个线程可以访问同步方法。

我不确定你发现它是什么令人困惑,但是当你持有它时,获取一个锁阻止其他线程获取它,并且一个类的所有非静态同步方法在同一个对象上同步,所以你的问题的答案是’是’,假设我理解正确。 我不知道“同步”还有什么意思,或者与其他意义有什么用处。