二 线程安全
2018-03-14 本文已影响0人
KeDaiBiaO1
编写线程安全的代码的核心是:
对可变共享的状态访问的管理。
三种(多个线程对同一个可变的状态变量没有做合适的同步时 出现错误的解决方法):
- 不共享
- 不修改
- 加同步 一般前两个是避免不了的时候加锁。
需要考虑线程安全的情况
对于可能被多个线程同时访问的可变状态变量,在访问它的时候都要持有同一个锁。
一般的加锁机制是 把可变共享变量封装在一个对象中,然后对本对象加锁。例如Vector类
同步策略:
- 内置锁(可重入),
- 读写锁(复制)
- Lock
- Collections获取
- 并发容器 原子操作 AtomicLong
原子性
原子类 AtomicLong等 作用:降低使用synchronized 并发。提升性能。
比如Vector类是同步类。
但是执行复合操作的时候并不能保证线程安全。此时需要使用锁。
复合操作 和 多线程执行顺序(竞态条件)问题 引发的无法使用原子性类解决
复合操作情况下 原子操作也会出现问题
需要使用锁
锁(原子操作无法实现的解决方法)
锁,用来锁住可变共享 状态。
有一个例子是使用了锁,但是因为不是锁的可变共享变量,而是锁的本对象(本对象并没有封装这个可变共享变量)导致线程不安全。