标签:多线程 技术 lse 释放 ola 简单的 结果 png 赋值
在计算机中,数据的运算从读取到写入结果要经过以下几步:
1.将变量从内存中读取;
2.将变量写入cpu缓存中;
3.由cpu运算器处理;
4.对变量赋予新值;
5.将变量写入缓存;
6.将变量从缓存写入内存;
问题1:为什么说volatile变量是轻量级的锁呢,和锁的区别是什么呢?
通过上述流程可以知道锁是锁住了一个代码块,及和锁对象有关的变量全被锁住了,不让其他线程读取,直到持有锁的线程将锁释放;
volitale变量的特点:
a. 1->2->3和4->5->6是连续的,正常的变量每一个步骤都是使用了一个内存屏障来隔离。
b. 写入内存后会通知其他cpu缓存失效。
流程如图:
问题2:volitale的缺点?
按照流程我们可以看出,如果是个正常的锁,那么所有的步骤都是没有其他线程干扰的,而volatile变量的处理和赋值动作不是连续的,
因此,在多线程情况下就有可能两个线程都进行了相同的步骤,导致一个线程对内存写入的操作覆盖了另一个线程的操作。因此,缺点就是不够安全。
思考:volitale变量的使用?
通过其特点我们可以知道简单的使用如true or false 这样的命令是没有处理这一步的,即是读取后就直接赋值了。
java对象的改变能够及时感知,当然volitale声明的只是一个对象引用,只是当引用发生变化时能够及时感知。
标签:多线程 技术 lse 释放 ola 简单的 结果 png 赋值
原文地址:https://www.cnblogs.com/zjyingchang/p/9964221.html