一、访问共享的可变数据时要同步

  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 读书笔记之九 并发的更多相关文章

  1. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  2. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  3. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  4. Effective Java 读书笔记之七 通用程序设计

    一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...

  5. Effective Java 读书笔记(五):Lambda和Stream

    1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...

  6. Effective Java 读书笔记(三):类与接口

    1 最小化类和成员的可访问性 (1)封装 封装对组成系统的组件进行解耦,从而允许这些组件独立开发,测试,优化,使用,理解和修改. 封装提高了软件的复用性,因为组件间的耦合度低使得它们不仅在开发环境,而 ...

  7. Effective Java 读书笔记之八 异常

    一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...

  8. Effective Java 读书笔记之三 类和接口

    一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含 ...

  9. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

随机推荐

  1. hibernate----(Hql)另一种查询---利用Criteria类

    package com.etc.test; import java.util.List; import org.hibernate.Criteria;import org.hibernate.Sess ...

  2. cobbler重装、web、定制化

    cobbler重装 根据此文已自动化安装centos 7的版本http://www.cnblogs.com/shhnwangjian/p/5858900.html 在cobbler-test主机上重装 ...

  3. java中"与"和"或"

    在java中"与"和"或"都具有短路功能. 关于"或"运算如 if(mc == null || mc.getReceive()==0){ / ...

  4. CentOS7安装Nginx并部署

    服务器IP是192.168.36.136 1.直接yum install nginx即可 2.主配置文件是/etc/nginx/下的nginx.conf,另外一个是/etc/nginx/conf.d/ ...

  5. 20145212 《Java程序设计》第10周学习总结

    20145212 <Java程序设计>第10周学习总结 学习内容总结 一.Java的网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net ...

  6. Java——jar命令

    把*.class压缩成一个文件,这样的文件就称为jar文件. 如果想要生成jar文件,直接使用JDK中bin目录里的jar.exe就可以将所有的类文件进行压缩. 当用户得到一个jar文件后,即可通过设 ...

  7. Python基本运算符

    Python基本运算符 什么是操作符? 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符. Python语言支持操作者有以下几种类型. 算术运算符 比较(即关系)运算符 ...

  8. codeforces 723B Text Document Analysis(字符串模拟,)

    题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...

  9. js 连接地址分析

    html的连接地址 <a href="/yzh/mobile/index.php?m=default&c=user&a=order_list&cla=dfk&q ...

  10. Linux基本使用(1)-使用GCC编译C语言程序