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

Lock能保证先发生后发生的关系吗?

刘英彦
2023-03-14

我有一个关于Java中代码重新排序和竞争条件的问题。

假设我有以下代码,有2个或多个线程同时执行workForThread()

public class Job {
   private Lock lock = new ReentrantLock();
   private int sharedObject = 1;
   public void workForThread() {
       lock.lock();
       try {
           sharedObject++;
       } finally {
           lock.unlock();
       }
   }
}

JVM是否可能以错误的顺序执行此操作?例如,以下重新排序是否可能?:

sharedObject++;
lock.lock();
lock.unlock();

还是保证锁不会被重新排序?

共有1个答案

丁光华
2023-03-14

让我们来看看Java文档对Lock接口的看法:

所有的锁实现都必须执行与内置监控锁所提供的相同的内存同步语义,如Java语言规范的第17.4节所述:

成功的锁定操作与成功的锁定动作具有相同的内存同步效果。

成功的解锁操作与成功的解锁操作具有相同的内存同步效果。

所以你的问题的答案是肯定的。< code>Lock为您提供了与常规< code>synchronized块/方法相同的重新排序保证。

 类似资料:
  • 问题内容: 在《 Java Concurrency InPractice》一书中,有几次告诉我们可以通过编译器,运行时JVM甚至处理器来重新排序程序的指令。因此,我们应该假定执行的程序不会以与源代码中指定的顺序完全相同的顺序执行其指令。 但是,上一章讨论的Java内存模型提供了一系列先 发生后 规则的清单,这些规则指示JVM保留哪些指令顺序。这些规则中的第一个是: “程序顺序规则。线程中的每个动作

  • 考虑一个MapReduce程序的WordCount问题。 让我们考虑一下映射器的输出如下:Hello 1 World 1 Hello 1 Hadoop 1 Hello 1Hadoop1 它去了分区器(我们将2指定为缩减器的no,)现在mapout在2个部分part1中获取分区: Hello 1 Hello 1 Hello 1 Hello 1 Part 2:世界1 Hadoop 1 Hadoop 1

  • 实现原子操作,因为java volatile保证发生在关系之前? 我之前读过关于volatile的报道: 如果线程A写入一个易挥发变量,线程B随后读取相同的易挥发变量,那么线程A在写入易挥发变量之前可见的所有变量,在线程B读取易挥发变量后也将可见。 现在,我有两个变量: 现在我有两个线程,一个只写给他们,先写给m_x,再写给m_y;另一个,只从他们那里读,先读m_y,然后,m_x。 我的问题是:写

  • 问题内容: 最小示例对话框: 我想要做的是让mbean.saveMethod以某种方式阻止对话框在出现问题时关闭,并且仅通过咆哮声输出消息。在这种情况下,验证程序无济于事,因为在将保存提交到后端服务器之前,无法确定someValue是否有效。当前,我使用visible属性进行此操作,并将其指向mbean中的布尔值字段。那行得通,但是它却使用户界面变慢,因为弹出或弹出对话框需要点击服务器。 问题答案

  • 假设我有一个普通的应用程序,其中我正在使用ApplicationContext ApplicationContext=new FileSystemXmlApplicationContext(“bean.xml”)创建一个Spring应用程序上下文 现在,假设在这个bean.xml有Spring bean的bean定义,所以当我创建应用程序上下文时,Spring容器将为这个实例化和初始化一个对象。

  • 本人2024届水硕一名,想趁着寒假找个实习,刷刷简历。 下面记录我momenta实习生的面试经历。 效率很高,头天找人内推进去,第二天hr打电话就约了面试,主要是聊了工作岗位和地点,实习时间能不能保证,然后就帮我约了面试。hr人很好,还挺提醒我不要紧张。 一面: 1.说一下面向对象里,哪些是c++独有的。 2.你经常使用的stl有哪些。说一下原理,后面我有介绍到哈希表,然后问了哈希表如何避免一个b