《Java并发编程实战》第十六章 Java内存模型 读书笔记
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究。
一、什么是内存模型,为什么须要它
Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规范、一致性等都来自于JMM。
2 重排序
3 Java内存模型简单介绍
程序顺序规则。假设程序中操作A在操作B之前,那么在线程中A操作将在B操作之前运行。
监视器锁规则。在监视器锁上的解锁操作必须在同一个监视器上的加锁操作之前运行。
Volative变量规则。对Volative变量的写入操作必须在对该变量的读操作之前运行。
线程启动规则。在线程上对Thread.Start的调用必须在线程中运行不论什么操作之前运行。
线程结束规则。在线程中的不论什么操作都必须在其它线程检測到该线程已结束之前运行,或者从Thread.join中成功返回,或者调用Threas.isAlive时返回false。
中断规则。当一个线程在还有一个线程上调用interrupt时,必须在被中断线程检測到interrupt调用之前运行(通过抛出InterruptedException,或者调用isInterrupted和interrupted)。
终结器规则。对象的构造函数必须在启动该对象的终结器之前运行完毕。
传递性。假设操作A在操作B之前运行,而且操作B在操作C之前运行,则操作A必须在操作C之前运行。
4 借助同步
将一个元素放入一个线程安全容器的操作将在还有一个线程从该容器中获得这个元素的操作之前运行。
在CountDownLatch上的倒数操作将在线程从闭锁上的await方法中返回之前运行。
释放Semaphore许可的操作将在从该Semaphore上获得一个许可之前运行。
Future表示的任务的全部操作将在Future.get中返回之前运行。
向Executor提交一个Runnable或Callable的操作将在任务開始运行之前运行。
一个线程到达CyclicBarrier或Exchanger的操作将在其它到达该栅栏或交换点的线程被释放之前运行。假设CyclicBarrier使用一个栅栏操作,那么到达栅栏的操作将在栅栏操作之前运行,而栅栏操作又会在线程从栅栏中释放之前运行。
二、公布
1 不安全的公布
2 安全的公布
3 安全初始化模式
4 双重检查加锁
三、初始化过程中的安全性
《Java并发编程实战》第十六章 Java内存模型 读书笔记的更多相关文章
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- 《Java并发编程实战》第七章 取消与关闭 读书笔记
Java没有提供不论什么机制来安全地(抢占式方法)终止线程,尽管Thread.stop和suspend等方法提供了这种机制,可是因为存在着一些严重的缺陷,因此应该避免使用. 但它提供了中断In ...
- 《Java并发编程实战》第四章 对象的组合 读书笔记
一.设计线程安全的类 在设计线程安全类的过程中,须要包括下面三个基本要素: . 找出构成对象状态的全部变量. . 找出约束状态变量的不变性条件. . 建立对象状态的并发訪问管理策略. 分析对象的 ...
- 《Java并发编程实战》第六章 任务运行 读书笔记
一. 在线程中运行任务 无限制创建线程的不足 .线程生命周期的开销很高 .资源消耗 .稳定性 二.Executor框架 Executor基于生产者-消费者模式.提交任务的操作相当于生产者.运行任务的线 ...
- 《Java并发编程实战》第十章 避免活跃性危急 读书笔记
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/love_world_/article/details/27635333 一.死锁 所谓死锁: 是指两 ...
- java并发编程实战:第六章----任务执行
任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性 ...
- 【java并发编程实战】第六章:线程池
1.线程池 众所周知创建大量线程时代价是非常大的: - 线程的生命周期开销非常大:创建需要时间,导致延迟处理请求,jvm需要分配空间. - 资源消耗:线程需要占用空间,如果线程数大于可用的处理器数量, ...
- 《Java并发编程实战》第八章 线程池的使用 读书笔记
一.在任务与运行策略之间的隐性解耦 有些类型的任务须要明白地指定运行策略,包含: . 依赖性任务.依赖关系对运行策略造成约束.须要注意活跃性问题. 要求线程池足够大,确保任务都能放入. . 使用线程封 ...
- 《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记
造成开销的操作包含: 1. 线程之间的协调(比如:锁.触发信号以及内存同步等) 2. 添加�的上下文切换 3. 线程的创建和销毁 4. 线程的调度 一.对性能的思考 1 性能与可伸缩性 执行速度涉及下 ...
- 《Java并发编程实战》第五章 同步容器类 读书笔记
一.同步容器类 1. 同步容器类的问题 线程容器类都是线程安全的.可是当在其上进行符合操作则须要而外加锁保护其安全性. 常见符合操作包括: . 迭代 . 跳转(依据指定顺序找到当前元素的下一个元素) ...
随机推荐
- spring mvc 和 jstl
spring ,jstl 在maven配置文件的配置:<dependency><groupId>org.springframework</groupId><a ...
- JS - 循环添加 DropDownList(Select)
代码: <td style="padding-left: 10px;"> <select id="ddl_picture_3"> < ...
- js / ajax 成功提交后怎么跳转到另外一个页面?
把success那段改成 success : function (r) { if ( r.status == 'error' ){ alert(msg[r.msgno]); } else if (r. ...
- rac各节点实例需设置为相同的一些参数
RAC Parameters That Require Identical Settings • ACTIVE_INSTANCE_COUNT • ARCHIVE_LAG_TARGET • COMPAT ...
- 轻量级工具网站SimpleTools
[解释]本来这篇文章是在前天发出来的,可是当时是刚申请的域名,现在都要域名实名认证,导致我发的项目网址打不开,惹来了很多博友的吐槽,在此说声抱歉,今天一大早就把实名认证提交了,现在网站已经可以正常访问 ...
- Net线程安全集合
在看Supersocket源码的时候发现很多地方都用到了我们不是很常用的线程安全集合,这些都是由net优化后的线程安全集合因此 应该比我们常规lock来效率好一些 比如说: 1 CurrentStac ...
- 用VC实现竖写汉字的方法
中国人自古就有自右至左.从上到下书写汉字的习惯.而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字.有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实 ...
- Windows消息队列
一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作“消息 ...
- pathload --有效的网络带宽估计方法
上一篇博客简述了现行的带宽估计的方法,分类,以及一些问题. 见:http://blog.csdn.net/ice110956/article/details/11071969 上文列出了13种现行的方 ...
- disruptor流程
这里先不提那些编译器方面的优化.只看一下基于无锁环形队列的生产者消费者模型的工作流程.上一个图先: 当中,buffer是一个数组,用来模拟环形队列. slowest_reader记录最慢的reader ...