同步方法是否会阻止更新对象字段?

时间:2015-01-07 20:34:34

标签: java multithreading locking synchronized locks

考虑以下课程。

public class Counter{

  private Lock lock = new Lock();
  private int count = 0;

  public int inc(){
    lock.lock();
    int newCount = ++count;
    lock.unlock();
    return newCount;
  }

  public int incBy2() {
      syncronized(this){
      count+=2;
      return count;   
      }
}

现在,Thread T1调用inc()方法,T2调用incBy2()。这里有竞争条件吗? 或将T2锁定this,从而阻止inc方法调用lock.lock()

2 个答案:

答案 0 :(得分:1)

有竞争条件。您基本上是在两个单独的对象上进行同步。两个线程可以同时输入inc()incBy2()个关键部分。

答案 1 :(得分:1)

对象上的监视器对对象的其余部分没有任何影响。在对象上获取监视器不会阻止任何线程修改该对象的字段。获取锁只会阻止其他线程获取该锁。

写作时

class Foo {

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

你最好写作

class Foo {
    private Object lock = new Object();

    public void doSomething() {
        sychronized(lock) {
            ...
        }
    }
}

第一个版本对你没有比第二个版本更多的东西。这两个版本之间的唯一区别是,在第二个版本中,如果其他对象获取Foo对象本身的监视器,它不会影响对doSomething的锁定(因此锁被封装在对象中,并且只能由调用的线程获取doSomething方法)。