考虑以下课程。
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()
?
答案 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方法)。