600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 多线程学习笔记(五)--Volatile关键字

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

时间:2020-05-27 04:46:55

相关推荐

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

强烈推荐一个大神的人工智能的教程:/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锁的,想要解决上述非原子性问题,就需要借助锁来完成非原子性操作的同步操作。

参考博文:

/24082.html

volatile和Cache一致性协议之MESI_jjavaboy的博客-CSDN博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。