reentrantlock如何实现和synchronized相同的内存语义

问题描述

reentrantlock如何实现和synchronized相同的内存语义

synchronized 内存语义:lock之后,同步代码块内的变量都从内存中取最新的,unlock之前,将线程的工作内存的东西都会更新到主内存。

而ReentrantLock 是如何实现synchronized的内存语义呢?

个人感觉:ReentrantLock源码里只是实现了一个锁的装置。并未涉及内存语义。难道所谓的内存语义是利用多线程间执行顺序来保证的吗?

嗯。不知道是自己哪里理解有问题。内存语义又没有办法用实验证明,请大牛提携一下!只是没钱,不好意思啊

解决方案

虽然没人回答,但是本人已经解决。还是感谢

时间: 2024-09-17 17:13:50

reentrantlock如何实现和synchronized相同的内存语义的相关文章

《Java并发编程的艺术》一一3.5 锁的内存语义

3.5 锁的内存语义 众所周知,锁可以让临界区互斥执行.这里将介绍锁的另一个同样重要,但常常被忽视的功能:锁的内存语义.3.5.1 锁的释放-获取建立的happens-before关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代码. class MonitorExample { int a = 0; public synchronized void writer() { // 1 a++; //

深度解析Java中volatile的内存语义实现以及运用场景_java

volatile内存语义的实现 下面,让我们来看看JMM如何实现volatile写/读的内存语义. 前文我们提到过重排序分为编译器重排序和处理器重排序.为了实现volatile内存语义,JMM会分别限制这两种类型的重排序类型.下面是JMM针对编译器制定的volatile重排序规则表: 举例来说,第三行最后一个单元格的意思是:在程序顺序中,当第一个操作为普通变量的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作. 从上表我们可以看出: 当第二个操作是volatile写时,

《Java并发编程的艺术》一一3.6 f?inal域的内存语义

3.6 f?inal域的内存语义 与前面介绍的锁和volatile相比,对f?inal域的读和写更像是普通的变量访问.下面将介绍f?inal域的内存语义.3.6.1 f?inal域的重排序规则 对于f?inal域,编译器和处理器要遵守两个重排序规则. 1)在构造函数内对一个f?inal域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 2)初次读一个包含f?inal域的对象的引用,与随后初次读这个f?inal域,这两个操作之间不能重排序. 下面通过一些示例性的代

Java并发编程系列之四:volatile和锁的内存语义

前言 在前面的文章中已经提到过volatile关键字的底层实现原理:处理器的LOCK指令会使得其他处理器将缓存刷新到内存中(确切说是主存)以及会把其他处理器的缓存设置为无效.这里的内存语义则说的是在JMM中的实现,那么为什么要理解volatile和锁在JMM中的内存语义呢?主要原因是这部分内容是与程序开发息息相关的,所以在高并发量的系统中,如果对这块知识的了解欠缺的话将无法设计出优雅支持高并发的系统(之前广被吐槽的12306,现在勉强能够支持千万级别的访问量了). volatile的内存语义 简

深入理解Java内存模型系列篇

[本文转载于深入理解Java内存模型,可点击每个章节标题查看原文] 深入理解Java内存模型(一)--基础 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必

深入理解Java内存模型(五)——锁

锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息.下面是锁释放-获取的示例代码: class MonitorExample { int a = 0; public synchronized void writer() { //1 a++; //2 } //3 public synchronized void reader() { //4 int i = a; //5 -- }

Java中的ReentrantLock和synchronized两种锁机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile.在简化与平台无关的并发类的开发的同时,它决没有使并发

ReentrantLock和synchronized两种锁定机制

ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性(visibility). 原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突. 可见性类似volatile关键字. 应用ReentrantLock显示锁 ReentrantLock 类实现了 Lock ,它拥有与 synchronize

ReentrantLock和synchronized锁机制分析

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并