多线程编程建议
1,将应用设计成支持多线程并发,可提高性能
2,编写多线程程序,首先保证它是正确的,其次再考虑性能
3,同步处理的开销大于非同步处理,如果可能,尽量使用非同步处理
4,避免多个共享变量共用一把锁,每个共享变量,都应该由一个唯一确定的锁保护
5,采用分拆临界资源等方式减少多线程阻塞或者等待
6,虽然缩小同步块的范围,可以提升系统性能。但在保证原子性的情况下,不可将原子操作分解成多个synchronized块
7,单一不可变对象往往是线程安全的(复杂不可变对象需要保证其内部成员变量也是不可变的)良好的多线程编程习惯是:将所有的域都声明为final,除非它们是可变的
8,设计线程安全的类,应该包括的基本要素:
a,确定哪些是可变共享变量
b,确定哪些是不可变的变量
c,指定一个管理并发访问对象状态的策略
9,对于可能被其它代码频繁调用的方法,对于常用工具类的方法,对于不能确认被其它代码如何调用的方法,需要关注同步问题
10,充分考虑复杂性,在满足应用需求的情况下,使用Java提供的线程池、并发容器
11,考虑切换、资源占用等开销,合理设置并发的线程数量
12,新起一个线程,都要设置线程名
13,多线程操作同一个字符串相加,应采用StringBuffer.
StringBuffer:线程安全的,append()等都是synchronized方法。
StringBuilder:非线程安全。
14,使用普通同步容器(Vector,Hashtable)的迭代器,需要外部锁来保证其原子性。原因是,普通同步容器产生的迭代器是非线程安全的
15, ConcurrentHashMap,CopyOnWriteArrayList并发容器的迭代器,以及全范围的size(),isEmpty()都表现出弱一致性。他们只能标示容器当时的一个数据状态。无法完整响应容器之后的变化和修改