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 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
随机推荐
- HTTP,TCP/IP协议
本文转自cnblogs:http://www.cnblogs.com/xhwy/archive/2012/03/03/2378293.html 一.概述 1.1 TCP HTTP UDP: 都 ...
- juqery 实现商城循环倒计时
<html> <hand> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jqu ...
- B450黑苹果之路(1)
安装黑苹果,采取的是懒人版写入磁盘分区中,然后再安装1)从硬盘中分两个区,一个是未来使用的目标分区,一个是磁盘镜像区2)由于HFS+支持逻辑分区,所以两个分区都放逻辑分区上,分区不格式化3)使用硬盘助 ...
- WinForm------BarManager中各种属性设置
1.offset:红色Tool距离左边Tool的偏移量
- htons
在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例: 1 2 #include<winsock2.h> u_shortht ...
- python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...
- GUI1_综合介绍
最终比较,选择pyqt用于GUI开发 https://pythonspot.com/en/gui/ 图形化界面可以使用PyQt5, PyQt4, wxPython or Tk.模板 Graphical ...
- SpringMVC处理请求流程
SpringMVC核心处理流程: 1.DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器 2.HandlerMapping处理器映射器,根据请求 ...
- JavaWeb学习笔记——JavaBean的保存范围和删除
- C#----我对坐标系的理解和图形转动
目录: 设置图形的旋转 设置坐标轴的反向 图形的旋转 参考一个文章:http://www.bccn.net/Article/kfyy/vc/jszl/200601/3008.html ; 目标:让Dr ...