一、什么是线程安全性
编写线程安全的代码
核心在于要对状态访问操作进行管理。
共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变.
线程安全性
共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变.
线程安全性
核心概念是正确性。某个类的行为与其规范完全一致。
多个线程同时操作共享的变量,造成线程安全性问题。
* 编写线程安全性代码的三种方法:
不在线程之间共享该状态变量
将状态变量修改为不可变的变量
在访问状态变量时使用同步
Java同步机制工具:
synchronized
volatile类型变量
显示锁(Explicit Lock )
原子变量
* 编写线程安全性代码的三种方法:
不在线程之间共享该状态变量
将状态变量修改为不可变的变量
在访问状态变量时使用同步
Java同步机制工具:
synchronized
volatile类型变量
显示锁(Explicit Lock )
原子变量
二、1 原子性
原子性
不可再分的操作。
例如:读,原子操作,写原子操作.
改变变量的值,非原子操作,因为涉及读,改,写
线程安全需要考虑的因素:
对象状态 - 什么叫有状态和无状态?无状态对象肯定是线性安全的?
复合操作 - 操作有多个步骤完成的操作 (例如, 先检测后执行, 变量的操作都分类三步 : 读取 - 修改 - 写入. )
竞态条件
先检测后执行
延迟初始化竞态条件(单例, 调用方法时才返回对象)
对象状态 - 什么叫有状态和无状态?无状态对象肯定是线性安全的?
复合操作 - 操作有多个步骤完成的操作 (例如, 先检测后执行, 变量的操作都分类三步 : 读取 - 修改 - 写入. )
竞态条件
先检测后执行
延迟初始化竞态条件(单例, 调用方法时才返回对象)
** 待添加实例解释原子性
遇到问题 - 可以保证每个变量都是线程安全的,但是如果一个方法中同时有多个变量,必须保证变量同步更新才算线程安全。
多个变量时需要加同一个锁,保证多个变量同时更新。
2.4 用锁来保护状态
通常认为只有写入的时候才需要锁,但如果读取的时候值值不能确保是否有其他现在正在修改或者以修改,同样会遇到问题。
2.5 *** 活跃性与性能
活跃性问题?
例如: 线程A等待线程B释放其持有的资源
性能问题?
例如: 线程切换过于频繁,CPU在线程调度上花费资源过多
*** 新的文章中总结锁相关知识与问题
思考
可能出现线程安全的地方?
变量相关
方法操作变量
情况:
多个线程访问一个变量
多个线程访问多个变量
多个线程访问多个方法,同时操作一个变量
多个线程访问多个方法,同时操作多个变量
二、2 线程安全解决办法
2.3 加锁机制遇到问题 - 可以保证每个变量都是线程安全的,但是如果一个方法中同时有多个变量,必须保证变量同步更新才算线程安全。
多个变量时需要加同一个锁,保证多个变量同时更新。
2.4 用锁来保护状态
通常认为只有写入的时候才需要锁,但如果读取的时候值值不能确保是否有其他现在正在修改或者以修改,同样会遇到问题。
2.5 *** 活跃性与性能
活跃性问题?
例如: 线程A等待线程B释放其持有的资源
性能问题?
例如: 线程切换过于频繁,CPU在线程调度上花费资源过多
*** 新的文章中总结锁相关知识与问题
思考
可能出现线程安全的地方?
变量相关
方法操作变量
情况:
多个线程访问一个变量
多个线程访问多个变量
多个线程访问多个方法,同时操作一个变量
多个线程访问多个方法,同时操作多个变量
2014-05-24 发文