二 线程安全

2018-03-14  本文已影响0人  KeDaiBiaO1
编写线程安全的代码的核心是:

对可变共享的状态访问的管理。

三种(多个线程对同一个可变的状态变量没有做合适的同步时 出现错误的解决方法):
  1. 不共享
  2. 不修改
  3. 加同步 一般前两个是避免不了的时候加锁。

需要考虑线程安全的情况
对于可能被多个线程同时访问的可变状态变量,在访问它的时候都要持有同一个锁。
一般的加锁机制是 把可变共享变量封装在一个对象中,然后对本对象加锁。例如Vector类

同步策略:
  1. 内置锁(可重入),
  2. 读写锁(复制)
  3. Lock
  4. Collections获取
  5. 并发容器 原子操作 AtomicLong

原子性

原子类 AtomicLong等 作用:降低使用synchronized 并发。提升性能。

比如Vector类是同步类。
但是执行复合操作的时候并不能保证线程安全。此时需要使用锁。

复合操作 和 多线程执行顺序(竞态条件)问题 引发的无法使用原子性类解决

复合操作情况下 原子操作也会出现问题
需要使用锁

锁(原子操作无法实现的解决方法)

锁,用来锁住可变共享 状态。
有一个例子是使用了锁,但是因为不是锁的可变共享变量,而是锁的本对象(本对象并没有封装这个可变共享变量)导致线程不安全。

上一篇 下一篇

猜你喜欢

热点阅读