作者|小明菜市场
来源 | 小明菜市场(ID:)
头图|CSDN东方IC下载
关键字主要用于指令重排序,常用于保证内存可见性和防止指令重排序。
保证内存可见性
内存可见性意味着所有线程都可以看到共享内存的最新状态。 例如,在多线程环境中,添加关键字后,每个线程的内存都会被强制刷新到主内存中,这样每个线程都可以保证自己的关键字内存是最新的。
从一个例子开始
给出一个无效的代码
public class MutableInteger {
private int value;
public int get(){
return value;
}
public void set(int value){
this.value = value;
}
}
这段代码在多线程环境下运行正常,但在非多线程环境下运行不正常,因为get和set方法没有添加同步锁。 如果线程调用set方法,那么调用get方法的线程两个方法可能会看到前一个值或后一个值。
解决办法很简单,直接添加关键词即可。
private volatile int value;
上面的代码中,添加关键字后,所有辅助线程的关键字内存都会被强制刷新到主线程中,这样每个线程中的变量关键字就能实时获取到最新值。 相当于锁定了get和set方法。
关于关键词
java变量的读写主要分为以下几个关键字来读写变量。 lock 将线程标记为独占。释放从主内存读取到工作内存的独占状态 load 加载到工作内存中 use 将工作内存的值传递给执行引擎 返回工作内存的值 store 返回的值工作内存向主内存写操作返回值到主内存
通过read load use这三个关键字的连续出现,以及,、store、write这三个关键字的连续出现,保证了原子性。其控制如下图所示
注意:该关键字是非锁机制,可以避免锁引起的上下文切换
禁用指令重新排序
1.什么是指令重排序
被关键字修饰的变量前面将会有一条锁汇编指令,该指令用于强制阻止指令被排序。
2. 如何禁止
通过内存屏障来实现,内存屏障分为写屏障、读屏障和读写屏障。
portant; overflow-wrap: break-word !important;" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(157, 157, 157)" data-darkmode-original-color-15870356071023="rgb(73, 73, 73)" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(157, 157, 157)" data-darkmode-original-color-15882384789136="rgb(73, 73, 73)" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(157, 157, 157)" data-darkmode-original-color-15882396318564="rgb(73, 73, 73)" data-darkmode-bgcolor-15910964149051="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15910964149051="rgb(255, 255, 255)" data-darkmode-color-15910964149051="rgb(157, 157, 157)" data-darkmode-original-color-15910964149051="rgb(73, 73, 73)" class="js_darkmode__22" data-darkmode-bgcolor-15924629205581="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15924629205581="rgb(255, 255, 255)" data-darkmode-color-15924629205581="rgb(157, 157, 157)" data-darkmode-original-color-15924629205581="rgb(73, 73, 73)" style="margin-top: 15px;margin-bottom: 15px;color: rgb(73, 73, 73);white-space: normal;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;font-size: 11pt;line-height: normal;">更多精彩推荐
inktype="2" style="color: rgb(0, 128, 255);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;line-height: normal;font-size: 14px;">☞inktype="2">Javascript 稳居第一、C# 连续下跌,调查 17000 名程序员后有了这些新发现!
inktype="2" style="color: rgb(0, 128, 255);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;line-height: normal;font-size: 14px;">☞inktype="2">龙飞船再次发射成功!马斯克无缘现场,因疑似感染新冠……inktype="2" style="color: rgb(0, 128, 255);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;line-height: normal;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: normal;font-size: 14px;">☞inktype="2" style="color: rgb(0, 128, 255);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: normal;font-size: 14px;">如何破解“中国开源拿来主义”?包云岗的几点分析
点分享 点点赞 点在看