1 什么时候需要考虑并发问题
多线程环境下(好多人第一反应是访问量大,是因为访问量大的程序多线程居多,但是两者并不等价)
2 多线程可能产生的问题有哪些
1.安全性(共同访问数据)
2.活跃性(例如死锁)
3.性能(多线程同步时会影响性能,线程的切换也会)
3 线程安全包括哪些方面
1.对象的正确创建(不要在构造器中使this逸出)
2.对象的安全发布
1.不可变对象可以通过任意机制发布
2.事实不可变对象必须通过安全的方式来发布
3.可变对象必须通过安全的方式来发布,并且必须是线程安全的或者由某个锁保护起来
注:不可变对象和实施部可变对象安全发布之后可以随意访问,可变对象的访问也需要是安全的,要么他本身负责在并发下的安全访问,即作为一个线程安全的对象被访问,或者由调用者来负责,此时需要文档说明该对象的访问方式。
4 如何解决并发问题
1.不在线程间共享(线程封闭和ThreadLocal可以实现)
2.将状态变量修改为不可变的变量(无状态对象一定时线程安全的)
3.访问时使用同步
5 安全发布一个正确构造的对象的方法
1.在静态初始化函数中初始化一个对象引用
2.将对象的引用保存到volatile类型的域或者AtomicReferance对象中
3.将对象引用保存到某个正确构造对象的final类型域中
4.将对象引用保存到一个锁保护的域中(如:将对象放入一个线程安全的容器)
安全的发布与安全的访问要区别开来,安全发布保证的是你发布的对象的可见性,如线程A发布一个对象,如果不是安全的发布可能会导致访问该对象的线程B看到尚未创建完成的对象,我是将安全的发布理解为一个原子操作,并保证其可见性即可。但是安全发布的对象访问时是否需要同步取决于该对象是否可变。
今天先写这么多,这是随笔,以后再整理。
如有错误,恳请指正,谢谢