非线程安全会在多个线程对同一个对象的实例进行并发访问时产生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。而线程安全就是对获得的实例变量的值进行同步处理,不会出现脏读的现象。
- 方法内的变量为线程安全
方法内部的私有变量,不存在非线程安全问题,这是由于每个线程都有各自的栈 - 实例变量非线程安全
如果两个线程同时访问一个没有同步的方法 ,同时操作业务对象中的实例变量,则有可能出现非线程安全问题。 - 多个对象多个锁
如果两个线程访问同一个类的两个不同实例的相同名称的同步方法,效果却是异步方式执行的。
图片.png
- synchronized锁重入
当一个线程得到一个对象锁后,再请求此对象锁时是可以再次得到该对象的锁的,这也证明在一个synchronized方法内部调用本类的其他sychronized方法/块时,是永远可以得到锁的。 - 出现异常,锁自动释放
当一个线程执行的代码出现异常时,其所持有的锁会自动释放
volatitle关键字
关键字vilatile的主要作用是使变量在多个线程间可见
volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有栈中取得变量的值。线程安全包括可见性和原子性,volatile可以保证可见性,但不能保证原子性。