我对对象锁定感到困惑。
下面的类有4个方法,方法addB()是同步的。

在我的scienario中,有4个线程。当线程2访问addB()方法(在Test对象上创建一个锁)时,是否还有其他线程同时访问addC()或addD()?

对象锁一次只允许一个线程吗?

class Test{
       private Integer a;
       private Integer b;
       private Integer c;
       private Integer d;


   public void addA(){
      synchronized(a) {
         a++;
      }
   }
   public synchronized void addB(){
         b++;
      }

   public void addC(){
         c++;
      }

   public void addD(){
         d++;
      }
   }

编辑:
我有3个线程(t1,t2和t3),每个线程都将访问addB(),addC()和addD()。如果线程t1访问方法addB(),线程t2是否可以同时访问addC()方法?如果不是,t2状态将是什么?
class Test{
       private Integer a;
       private Integer b;
       private Integer c;
       private Integer d;


   public void addA(){
      synchronized(a) {
         a++;
      }
   }
   public synchronized void addB(){
         b++;
      }

   public synchronized void addC(){
         c++;
      }

   public synchronized void addD(){
         d++;
      }
   }

最佳答案

锁确实确实一次只允许一个线程,但是不同的锁不会互相影响。

在您的示例中,您有两个锁-一个在属于a的互斥锁上,另一个在一个属于this的互斥锁上(如您在文章中正确提到的那样,当您使用synchronized关键字时这是隐式的)。

因此,对addB()的调用将被同步,但不会阻止对任何其他方法的调用。如果一个线程持有this的锁,则另一个线程可以持有a的锁,而其他多个线程可以同时执行addC()addD()

编辑:顺便说一句,如果您确实在使用AtomicInteger,则可能有兴趣学习Integer类。它们提供了原子操作,因此您不必担心围绕它们进行同步。

09-27 14:16