我对对象锁定感到困惑。
下面的类有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
类。它们提供了原子操作,因此您不必担心围绕它们进行同步。