Java多线程学习笔记(持续更新)

1 线程安全的核心在于对状态访问操作进行管理,尤其是共享的和可变的,所以可变对象尽量写在run方法内部

2 synchronized/volatile/显示锁/原子变量?/transient

3 多个线程访问同一个可变状态变量时没有合适的同步,三种方式可以同步:

(1)不在线程之间共享该状态变量

(2)将状态变量改为不可变的变量,要么final,要么new一个新对象?即使对象里所有域都是final类型,对象仍然可变,因为final类型的域中可以保存对可变对象的引用。final域能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无须同步。

(3)在访问状态变量时使用同步

4 无状态对象一定是线程安全的,这里的状态指类的变量

5 当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件,例如:延迟初始化

6 java.util.concurrent.atomic包包含了一些原子变量类,例如:通过用AtomicLong来代替long类型的计数器

7 要保持状态的一致性,就要在单个原子操作中更新所有相关的状态变量?

8 内置锁:@GuardBy("this")

9 当计算时间较长,一定不要有锁,例如:网络IO或控制台IO

10 对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解为两个32位的操作,所以读写操作在不同的线程里执行,可能会读到某个值的高32位和另一个值的低32位

11 volatile的典型用法:检查某个某个状态标记以判断是否退出循环。可确保将变量的更新操作通知其他线程。加锁机制可同时确保内存可见性和原子性,而volatile只确保可见性。

12 this引用逸出?public getter方法会导致逸出?

你可能感兴趣的:(Java多线程学习笔记(持续更新))