Effective Java 读书笔记之九 并发
一、访问共享的可变数据时要同步
1、synchronized关键字既然保证访问的可见性也能保证原子性。而volatile修饰符只能保证变量的线程可见性。
2、增量操作符等不是原子性,多线程操作时可能导致结果不正确。
3、尽量将可变数据限制在单个线程中。
4、多个线程共享可变的数据时,每个读或者写数据的线程都必须同步。
二、避免过度同步
1、在同步的方法或者代码块中,注意多态等级制引入的客户端的外来输入,要保证其没有破坏同步机制和造成死锁。
2、尽量把对外来方法的调用移动到同步区域之外。
3、在同步区域里尽可能做少量的工作。
4、过度同步会造成性能问题,也限制了代码的优化潜能。
5、如果一个类要并发使用,就应该使这个类变成线程安全的,当内部同步能带来明显的性能提升时才使用内部同步。
6、如果方法修改了静态域,那么必须同步这个域的访问。
三、executor和task优先于线程
1、尽量不要编写自己的工作队列,而且还应该尽量不直接使用线程。而是要用executor和task来完成任务。
2、Executor Framwork把原来Thread的抽象分成两个:一个是执行抽象executor; 一个是认为抽象task。
四、并发工具优先于wait和notify
1、正确地使用wait和notify比较困难,就应该用更高级的并发工具来代替,并发工具分成三类:Executor Framework、并发集合以及同步器。
2、同步器是一些是线程能够等待另一个线程的对象,运行他们协调动作。
3、一定要看《Java并发编程实践》。
五、线程安全性的文档化
1、每个类都应该在文档中仔细地说明线程安全性。
六、慎用延迟初始化
1、除非决定必要,否则不要去优化
2、静态域的延迟初始化,可以使用lazy initialization holder class 模式。
3、实例域的延迟初始化,可以使用double check idiom 模式。
4、对可接受重复初始化的示例域,可以考虑单重检查模式。
七、不要依赖于线程调度器
1、不要企图通过Thread.yield来修正程序线程的调度
2、线程优先级在java平台上不可移植。可以提高运行性能,不能修正程序。
八、避免使用线程组
1、线程组现在唯一的用途是用来在一组线程上运用某些基本功能。
Effective Java 读书笔记之九 并发的更多相关文章
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java 读书笔记之七 通用程序设计
一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...
- Effective Java 读书笔记(五):Lambda和Stream
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...
- Effective Java 读书笔记(三):类与接口
1 最小化类和成员的可访问性 (1)封装 封装对组成系统的组件进行解耦,从而允许这些组件独立开发,测试,优化,使用,理解和修改. 封装提高了软件的复用性,因为组件间的耦合度低使得它们不仅在开发环境,而 ...
- Effective Java 读书笔记之八 异常
一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...
- Effective Java 读书笔记之三 类和接口
一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含 ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
随机推荐
- jsp分页功能
http://blog.csdn.net/xiazdong/article/details/6857515
- boolean 和 Boolean 类型数据的差别
工作中遇到页面传递布尔类型的数据问题,需要在代码中判断不能为null,就此思考一下,boolean和Boolean之间的区别?boolean是基本数据类型Boolean是它的封装类,和其他类一样,有属 ...
- String 类相关知识
1.常用方法 1)判断字符串是否为空 public boolean isEmpty()2)获取字符串长度 public int length()3)截取子子串 public String substr ...
- IDEA 搭建的SpringMVC Maven项目出现的问题
1.添加jar包时,报添加某个jar包有问题,在pom.xml文件的project节点上有红波浪线 jar引用的maven地址没有问题,就是报错 解决办法:到本地仓库把相关jar包删掉重新下载 2.各 ...
- JavaScript学习笔记——基本知识
JavaScript学习的教程来自后盾网 1>JavaScript的放置和注释 1.输出工具 A.alert(); B.document.write(); C.prompt("&quo ...
- 最好用的placeholder插件,jQuery插件EnPlaceholder
EnPlaceholder插件支持密码框哦!实际对比同类的placeholder插件在ie等浏览器下效果做好! 插件效果预览:http://www.wufangbo.com/demo/jquery/3 ...
- border设置不占用宽度
经常我们设置好了DIV或其他标签的宽度,但是一加边框,宽度就又增加了,尤其是用百分比的时候,宽度控制不好真是麻烦! 如下有一解决办法,代码如下,(新属性,兼容性不好,手机端.谷歌.火狐测试可以) -w ...
- osharp3 整合 dbcontextscope 文章2 将dbcontext的创建收回到ioc管理
osharp3 整合 dbcontextscope 后,,dbcontextscope 对dbcontext管理的很好,做到,用到时创建,不用时销毁,下面看一个 trace aspx.page: En ...
- 数据库操作事务IsolationLevel 枚举
成员名称 说明 Chaos 无法覆盖隔离级别更高的事务中的挂起的更改. ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复 ...
- 未能加载文件或程序集“MySQLDriverCS
未能加载文件或程序集“MySQLDriverCS, Version=3.0.1735.36021, Culture=neutral, PublicKeyToken=172f94dfb0faf263”或 ...