当前位置: 首页 > 知识库问答 >
问题:

重入锁是同步的完全替代品吗?

闾丘正志
2023-03-14

我浏览了“http://www . IBM . com/developer works/Java/library/j-jtp 10264/”这篇文章。他们提到“锁框架是同步的兼容替代品”。我知道通过使用可重入锁,我们可以跨方法持有锁,等待锁一段时间(使用同步块(或)方法是不可能的)。我的疑问是,有没有可能用带有可重入锁的同步机制来代替应用程序?

例如,我想实现一个线程安全的堆栈数据结构,其中所有的推送,pop,getTop方法都是同步的,因此在多线程环境中,一次只有一个线程能够访问一个同步方法(如果一个线程使用推送方法,则没有其他线程能够访问推送,pop,getTop(或)堆栈类的任何其他同步方法)。是否可以使用重入锁实现相同的线程安全堆栈数据结构?如果可能,请提供一个例子来理解这一点。

共有3个答案

胥英奕
2023-03-14

Brian Goetz在第13.4章的"Java并发实践"中对此进行了讨论:

重入锁定是一种高级工具,适用于固有锁定不切实际的情况。如果您需要其高级功能,请使用它:定时,轮询或可中断的锁定获取,公平排队或非块结构锁定。否则,首选同步。

我绝对同意,因为恕我直言:

synchronized (lock) {
    // ...
}

比这更具可读性,更不容易出错:

try {
    lock.lock();
    // ...
} finally {
    lock.unlock();
}

长话短说:从技术角度来看,是的,你可以用重入锁替换同步,但我不会这样做。

还要检查这些问题:

    < li >同步与锁定 < li >如果可以使用synchronized(this ),为什么要使用ReentrantLock?
何承
2023-03-14

答案是“是的”。

lock-解锁对用于代替同步(){…}await信号条件中替换为等待通知

唐博文
2023-03-14

用< code>synchronized可以做的任何事情也可以用< code>ReentrantLock来做,但反之则不行。也就是说,如果你需要的只是< code >锁定/解锁语义,我建议使用< code >同步,因为在我看来,它更具可读性。

 类似资料:
  • 我是node.js的新手 我对使用promise而不是回调感到困惑。 promise存在时,我何时需要回拨? 回调的哪些属性迫使我使用它,而不是promise?

  • 问题内容: 是 与…相同 ? 如果没有,请纠正我。 问题答案: 不它不是。的设置的请求 报头 。对于HTTP请求,您可以在此处找到所有可能的标头。 在刚刚写入请求 体 。如果内容采用urlencode编码,通常会将查询字符串写到请求正文中,而不是像那样将其附加到请求URI上。 就是说,在HTTP URI的情况下,已经隐式地将request方法设置为(因为隐式要求将其写入请求主体),因此无需执行后续

  • 我正在阅读Java中重入锁和同步块之间的比较。我正在浏览互联网上的各种资源。我在同步块上使用Reentrant锁发现的一个缺点是,在上一个中,您必须显式使用try final block来调用final telock在final块中获取的锁上调用解锁方法,因为您的关键代码部分可能会引发异常,并且可能会造成大麻烦, 如果线程没有释放锁,而在后一个中,JVM本身负责在发生异常时释放锁。 我不太相信这个

  • 同步(Synchronize)操作是web编程中不可以避免的, 在java中, 我们通过同步代码块,同步方法,同步对象锁等等各种办法去实现,而且这些 方法都是java内置实现的我们直接使用就行。但是php中我们需要自己去实现。 Herosphp框架提供了2种实现同步操作的方法,供你在高并发中实现逻辑的有序操作。 FileSynLock FileSynLock 是基于系统的文件锁实现,它的特点是兼容

  • 根据文件中的说明: setState()不会立即改变this.state,但会创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。 对setState的调用不能保证同步操作,可能会为了提高性能而对调用进行批处理。 因此,由于是异步的,因此无法保证其同步性能。是否有同步的替代方法。 例如 因为值是以前的值,所以什么是替代方案,将给予使用。 Stackoverflow上有几个问题

  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。