每篇博客或解释都让我看到了Locks API相对于同步的优势。
我想知道同步是否比锁更有优势,或者我应该更喜欢同步而不是锁的任何场景。
发布于 2015-07-12 12:39:31
您是指synchronized语句和方法关键字吗?隐式锁定的主要优点是需要更少的代码,并在离开其作用域时自动解锁。对于简单的锁/等待操作,它是完美的解决方案。
所以下面的代码
public void myMethod() {
synchronized(this) {
// concurrent stuff
}
}完全等同于
final private Lock lock = new ReentrantLock();
public void myMethod() {
lock.lock();
try {
// concurrent stuff
}
finally {
lock.unlock();
}
}和
synchronized public void myMethod() {
// concurrent stuff
}您还可以使用不同的对象进行同步(它们不会以任何方式受到影响,只是控制点):
final static private Object sync = new Object();
public void method1() {
synchronized(sync) {
// concurrent code involving static members
}
}
public void method2() {
synchronized(this) {
// concurrent code affecting this instance
}
}发布于 2015-07-12 13:03:45
除了@Shepard的答案之外,使用synchronized更不容易出错。考虑这些错误,它们可能导致锁不能被释放:
final private Lock lock = new ReentrantLock();
public void myMethod() {
lock.lock();
// concurrent stuff
}
public void myMethod2() {
lock.lock();
// concurrent stuff that might throw an unchecked exception
lock.unlock();
}
public void myMethod3() {
lock.lock();
try {
// concurrent stuff
lock.unlock();
} catch ( ... ) {
...
} finally {
...
}
}第一个可能会在测试中出现,但后两个可能不会。
使用synchronized时,您不能犯任何这样的错误。
然而,尽管有这些考虑,Lock还是很有用的:
Condition对象。https://stackoverflow.com/questions/31364307
复制相似问题