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

  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. squid代理服务器配置详解

    root@proxy squid]# cat squid.conf## Recommended minimum configuration:#visible_hostname www.jd.com # ...

  2. Java数据结构——双向链表

    //================================================= // File Name : DoublyLinked_demo //------------- ...

  3. 如何查看crontab的日志记录

    在Unix和类Unix的操作系统之中,crontab命令常用于设置周期性被执行的指令,也可以理解为设置定时任务. crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下 ...

  4. CodeForces 710CMagic Odd Square(经典-奇数个奇数&偶数个偶数)

    题目链接:http://codeforces.com/problemset/problem/710/C 题目大意:输入一个奇数n,则生成n*n矩阵,要求矩阵的行.列还有斜着,所有元素之和为奇数. 解题 ...

  5. OpenGL Driver Architecture[转]

    http://www.cnblogs.com/cgwolver/archive/2009/01/04/1368350.html

  6. 9-slice-scaling

    9-slice-scaling http://rwillustrator.blogspot.com/2007/04/understanding-9-slice-scaling.html

  7. angularjs学习笔记—工具方法

    angular.bind(self, fn, args) 作用:返回一个新的函数,绑定这个函数的this指向self 参数: self:新函数的上下文对象 fn:需要绑定的函数 args:传递给函数的 ...

  8. URL中“#” “?” &“”号的作用

    URL中"#" "?" &""号的作用   阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twit ...

  9. C++ default 和delete的新用法

    C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...

  10. redis+Keepalived实现Redis主从复制

    redis+Keepalived实现Redis主从复制: 环境:CentOs6.5Master: 10.10.10.203Slave:   10.10.10.204Virtural IP Addres ...