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 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
随机推荐
- python03 面向对象的编程01
话不多说,直接进入正文: 编程思想: 我个人所了解的有2种,还有个函数式编程的概念模模糊糊(大概是把常用的代码封装成一个函数,重复调用即可,先认为就是这样吧) 1 面向对象:面向对象是把所有的事务物当 ...
- 十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))
十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的 ...
- 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
本文将从系统模型.序列化与协议.客户端工作原理.会话.服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕. 一.系统模型 1.1 数据模型 ZooKeeper的视图结构使用了其特有的& ...
- BZOJ2960: 跨平面
从一条边出发遍历,每次找旋转角度最小的一条边作为下一条边,直到回到出发的边,就得到了一个区域.这样建出对偶图后跑不定根的最小树形图就行了. #include<bits/stdc++.h> ...
- const 和 readonly 修饰符的用法
1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. co ...
- vim 显示颜色脚本
vim 显示颜色脚本 echo TERM=xterm >>/root/.bash_profile echo export TERM >>/root/.bash_profile ...
- JavaWeb学习笔记——SAX解析
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHa ...
- Java——复选框:JCheckBox
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ItemEvent; import java. ...
- ecshop修改注册、增加手机
1.去掉“用户名”注册 a.去掉提交 user_passport.dwt页面去掉 <input name="username" type="text" s ...
- 获取<img src="sdf.jpg" Big="sf.jpg">中的big的值
原代码: <img src="sdf.jpg" Big="sf.jpg" onclick="getsrc($(this).attr(" ...