java并发实战-基础知识

1.线程安全

共享:变量可以由多个线程同时访问.可变:变量值在生命周期内可以变化.

当多个线程访问某个类时,这个类始终都能表现出正确的行为,称这个类是线程安全的.

无状态对象是线程安全的.

2.原子性

竞态条件:由于不恰当的执行时序而出现不正确的结果,是一种非常重要的情况.

a.先检查后执行是一种常见的延迟初始化操作.目的是:将对象的初始化操作推迟到实际被使用时才执行.同时要确保只被初始化一次.

3.复合操作

避免竞态条件问题,必须在某线程修改该变量时,通过某种方式防止其让线程使用这个变量.从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改过程.有两个操作A和B,当一个线程执行的时候要么执行完,要么不执行.那A和B对彼此来说就是原子性的,

4.加锁操作

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

5.重入

重入获取锁的操作粒度是线程,而不是调用.重入的一种实现方式是:为每个锁关联一个获取计数和一个所有者线程.当计数值为0,当计数值为0,认为这个锁没有被任何线程持有.

6.用锁来保护状态

每个共享的和可变的变量都应该只由一个锁来保护,从而使维护人员知道是哪个锁.

在简单性和性能之间存在着相互制约因素,当实现某个同步策略时,一定不要盲目为了性能而牺牲简单性.

当执行时间较长或者无法完成的操作(如网络I/O,或控制台I/O)一定不要持有锁.

猜你喜欢

转载自www.cnblogs.com/changlili/p/10201554.html
今日推荐