首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步优于Locks API的优点

同步优于Locks API的优点
EN

Stack Overflow用户
提问于 2015-07-12 12:15:49
回答 2查看 133关注 0票数 3

每篇博客或解释都让我看到了Locks API相对于同步的优势。

我想知道同步是否比锁更有优势,或者我应该更喜欢同步而不是锁的任何场景。

EN

回答 2

Stack Overflow用户

发布于 2015-07-12 12:39:31

您是指synchronized语句和方法关键字吗?隐式锁定的主要优点是需要更少的代码,并在离开其作用域时自动解锁。对于简单的锁/等待操作,它是完美的解决方案。

所以下面的代码

代码语言:javascript
复制
public void myMethod() {
    synchronized(this) {
       // concurrent stuff
    }
}

完全等同于

代码语言:javascript
复制
final private Lock lock = new ReentrantLock();

public void myMethod() {
    lock.lock();
    try {
        // concurrent stuff
    }
    finally {
        lock.unlock();
    }
}

代码语言:javascript
复制
synchronized public void myMethod() {
    // concurrent stuff
}

您还可以使用不同的对象进行同步(它们不会以任何方式受到影响,只是控制点):

代码语言:javascript
复制
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
     }
}
票数 7
EN

Stack Overflow用户

发布于 2015-07-12 13:03:45

除了@Shepard的答案之外,使用synchronized更不容易出错。考虑这些错误,它们可能导致锁不能被释放:

代码语言:javascript
复制
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还是很有用的:

  • 锁允许您实现不同的锁定策略,如不可重入锁定和多读取器/单写入器锁定。
  • 锁允许您跨作用域/块结构边界持有锁。(这使您的代码更难推理,但对于某些用例是必要的;例如,需要跨多个事件处理程序持有锁的基于事件的设计。)
  • 锁API允许您测试锁,在没有阻塞或超时的情况下获取锁,并定义Condition对象。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31364307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档