Java同步方法锁定对象还是方法?
如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体?
例:
class X {    private int a;
    private int b;
    public synchronized void addA(){
        a++;
    }
    public synchronized void addB(){
        b++;
    }
}
2个线程可以同时执行x.addA()访问类X的相同实例x.addB()吗?
回答:
如果将方法声明为已同步(就像你通过键入进行的操作一样public synchronized void addA()),则会在整个对象上进行同步,因此,从同一对象访问不同变量的两个线程仍然会相互阻塞。
如果你一次只想同步一个变量,那么两个线程在访问不同的变量时不会互相阻塞,你可以分别在synchronized ()块中同步它们。如果a和b是对象引用,则可以使用:
public void addA() {    synchronized( a ) {
        a++;
    }
}
public void addB() {
    synchronized( b ) {
        b++;
    }
}
但是由于它们是原始类型,所以你不能这样做。
我建议你改用AtomicInteger:
import java.util.concurrent.atomic.AtomicInteger;class X {
    AtomicInteger a;
    AtomicInteger b;
    public void addA(){
        a.incrementAndGet();
    }
    public void addB(){ 
        b.incrementAndGet();
    }
}
以上是 Java同步方法锁定对象还是方法? 的全部内容, 来源链接: utcz.com/qa/425939.html

