多线程学习笔记(五)--Volatile关键字

         强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

实现了变量在多个线程间可见。

我在网上看了许多博客后,发现总结的都差不多,Volatile的几点特性也讲解的听清楚,所以我就不再重写,在此记录以下自己的理解。下图来自网络:

1.线程在使用某个变量时,会从主内存读到线程工作内存,当没有加volatile关键字时,一旦线程将变量复制一份到工作内存,再次使用变量的时候会直接使用工作内存的数据,导致一个问题就是脏读,主内存的变量值已经改变了,但是线程却不知道。

2.加上volatile关键字后,在主内存变量值发生改变后,会将在工作内存中存有该变量的内存地址全部置为无效地址,线程去read和load的时候会重新从主内存读取变量到工作内存

3.在没有加volatile关键字时store操作将更新的值写入工作内存后,什么时候会更新到主内存是未知的

4.加上volatile关键字后,store操作将更新的值写入工作内存后,会立即写回到主内存

5.volatile关键字非原子性的特性导致了线程不安全的特性

           例如:执行i=i+1时,会执行三个操作,分别如下:

 

 

  • 从内存取出i的值
  • 计算i的值
  • 将i的值写到内存中

若现在主内存中i的值发生了改变,现在有两个线程都要执行i=i+1操作,那么这两个线程都去执行read和load操作,这也就是第一步.从内存取出i的值,加入i的值是10,那么现在,这两个线程都是从主内存读取的,这是没问题的,这两个线程的工作内存现在的值也就是10,当线程1执行第二步和第三步后,主内存的i值变为11,线程2同样执行第二步和第三步操作,这时虽然主内存发生了变化(从10变成11),但是由于线程2已经执行过read和load了,这一次的操作就不会再从主内存中更新了,因此线程2进行完第二步和第三步更新主内存中的值,依旧更新成11。因此volatile关键字是替代不了synchronized锁的,想要解决上述非原子性问题,就需要借助锁来完成非原子性操作的同步操作。

参考博文:

 http://www.importnew.com/24082.html

https://blog.csdn.net/jjavaboy/article/details/77164474

 

               

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页