对象及变量的并发访问

非线程安全会在多个线程对同一个对象的实例进行并发访问时产生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。而线程安全就是对获得的实例变量的值进行同步处理,不会出现脏读的现象。

  • 方法内的变量为线程安全
    方法内部的私有变量,不存在非线程安全问题,这是由于每个线程都有各自的栈
  • 实例变量非线程安全
    如果两个线程同时访问一个没有同步的方法 ,同时操作业务对象中的实例变量,则有可能出现非线程安全问题。
  • 多个对象多个锁
    如果两个线程访问同一个类的两个不同实例的相同名称的同步方法,效果却是异步方式执行的。
图片.png
  • synchronized锁重入
    当一个线程得到一个对象锁后,再请求此对象锁时是可以再次得到该对象的锁的,这也证明在一个synchronized方法内部调用本类的其他sychronized方法/块时,是永远可以得到锁的。
  • 出现异常,锁自动释放
    当一个线程执行的代码出现异常时,其所持有的锁会自动释放

volatitle关键字

关键字vilatile的主要作用是使变量在多个线程间可见
volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有栈中取得变量的值。线程安全包括可见性和原子性,volatile可以保证可见性,但不能保证原子性。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容