一:Volatile
线程安全三方面
1 可见性:一个线程对共享变量修改,另一个线程可以看到最新结果
2 有序性: 一个线程内,代码编写按顺序执行
3 原子性: 一个线程内多行代码以一个整体运行,期间不能有其他线程的代码插队
Volatile
可以保证可见性
和有序性
原子性:
一行代码(例如a++)编译成字节码对应多行指令,不能保证原子性,多线程下指令交错,结果就不准确
如图:a操作的多条指令执行间,b操作进来执行,修改了数值,
但是a继续操作,还是在a之前读到的数上操作。由此造成结果错误
可见性:
一个线程对共享变量进行修改,另一个线程没有得到最新结果
Volatile修饰变量可以解决
有序性:
编译器和处理器为了优化程序性能对指令序列进行重新排序的一种手段,有时会改变
程序语句的先后顺序
二: ThreadLocal
对一个变量来说,多线程访问必须考虑线程安全问题。可以考虑加锁、cas来保证
ThreadLocal采用相反的做法:实现线程对象的资源隔离,每个线程各用各的资源
线程1用资源1,线程2用资源2,不再争抢,避免争用引发的线程安全问题。
那此时用局部变量不行吗?局部变量线程安全,但是无法共享
线程间资源隔离,线程内资源共享
以上代码实现了connection的资源隔离,每个线程进来获取的connection都是不同的
原理:每个线程内都有一个ThreadLocalMap类型的成员变量,用来存储资源对象
ThreadLocal
为key,资源对象为value