1.什么是线程安全性
引用《java并发编程实战》中的话
在线程安全性的定义中,最核心的概念就是正确性。
我们也可以这么定义:当多个线程访问某个类的时,这个类始终都能表现出正确的行为,那么我们就可以称这个类是线程安全的。
那么如何编写线程安全的代码呢?
1). 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享和可变状态的访问
2 ).对象的状态是指存储在状态变量(例如实例或者静态域)中的数据
一个对象是否需要时线程安全的额,取决于他是否被多个线程访问。要使得对象是线程安全的,需要采用同步机制来协同对对象可变状态的访问。
如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误,有3个方法可以修复这个问题:
1.不在线程之间共享这个状态变量
2.将状态变量修改为不可变的变量
3.在访问状态变量的时候使用同步
并发编程的bug源头我们追本溯源基本上可以总结为3点:
源头之一:缓存导致的可见性问题
源头之二:线程切换带来的原子性问题
源头之三:编译优化带来的有序性问题