Effective Java之并发
并发本身有两个概念:1.互斥性;2.可见性;
先来说一下可见性,就是让共享的变量在进程间可以及时获得最新版本的数据;这里比较简单的方式是为可能被并发修改的全局变量添加上volatile关键字;volatile关键作用根据我查找的用途,有两方面:
- 在c++中,它的寓意是通知编译器对于该字段处理取消优化,强制每次都是内存中取值;优化的概念是编译器有的时候会自作聪明的把一些变量的复制过程简化,比如如果对于一个值连续付了两次值,那么将会被优化为只记录最后一次;对于单线程而言这种处理没有问题,但是对于多线程而言,结果就是未知的(此句话有待考证);
- 第二个则是强制每次取值都是从内存取值,否则系统处理会尝试首先从寄存器取值;
Volatile有他的局限性,比如对于i++这类多步骤处理,他就无法保证在取值和+1过程是原子的,所以这种情况下就需要互斥锁synchronize锁。
Synchronize锁需要注意一点,就是保证锁范围尽量少,尽快释放锁;在加锁的代码段尽量不要调用外部函数,因为外部函数不可控,还很容易引发死锁;
尽量多使用java内部封装的多线程工具,而不要使用wait-notify模式,但是如果是使用了,要保证wait是防止在while函数体里面,因为对于notify/notifyAll的调用你无法保证意图以及准确性;while函数体可以附加上条件检验;所以即使notify错了,因为附加条件不通过仍然会是等待线程处于等待状态;以及尽量少的直接使用Thread,而是使用Executor Framework封装的类以及Task对象;
不要使用Thread.yield以及线程池优先级;后者的作用仅仅是将控制权换回了线程调度器,后者不具备可移植性,如果发现了多线程问题尽量不要使用这两种方式。对于Thread.yield可以使用thread.sleep(1)来替代( 不要使用thread.sleep(0),它代表立即返回)。至于ThreadGroup就彻底放弃吧,没有什么意义的对象,而且还不保证线程安全性。
Effective Java之并发的更多相关文章
- Effective java -- 9 并发/序列化
关于同步的问题,想弄明白java,同步不会是不行的.这不书弄完后还会从<java并发编程实战>和<java并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...
- 《Effective Java》 学习笔记 —— 并发
<Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- [Effective Java]第八章 通用程序设计
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- 5. Effective Java 第三版——使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- C#中多线程 委托的使用
背景: 什么是多线程?我们在建立以个C#项目时,往往会在Form1上添加控件,然后写代码,初 学者都是在重复这个过程,其实这个过程是单线程的,可以理解为只有“main”主线程,有 的时候往往需要同时 ...
- 【转】获取Sprite的实际Rect
判断点击是否点击在了一个精灵上, 其实就是判断一个点是否在一个矩形内. cocos2d-x的2.0.2版本可以使用CCRect的函数 bool CCRect::containsPoint(const ...
- sed命令详解--转
1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- [转]使用Beaglebone Black的SPI
分类: Beaglebone Black2013-11-24 18:21 678人阅读 评论(6) 收藏 举报 beaglebone blackbeagleboneSPIdevice tree 目 ...
- HDFS的java客户端操作代码(Windows上面打jar包,提交至linux运行)
1.通过java.net.URL实现屏幕显示demo1文件的内容 package Hdfs; import java.io.InputStream; import java.net.URL; impo ...
- java.util.Stack类简介
Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...
- hibernate篇章六--demo(Hibernate之第1解之-hibernate_demo_1)
准备工作做好了,开始Hibernate: 1:建立包:package:dao.model.service.util包: 2:开始model实体类Student:id,sname生成getter/set ...
- Objective-c单例模式详解
转载自:http://www.jianshu.com/p/85618bcd4fee 单例模式出现以后,关于它的争执就一直存在.在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一份 ...
- 解决IE浏览器IFrame对象内存不释放问题
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...
- JAVA中实现百分比
import java.text.NumberFormat; public class TeachYou { public static void main(String[] args) { //这里 ...