JAVA高级:多核线程-volatile原理与本领[Java编程]
本文“JAVA高级:多核线程-volatile原理与本领[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为什么利用volatile比同步代价更低?
同步的代价, 主要由其覆盖范围决意, 假如可以降低同步的覆盖范围, 则可以大幅晋升程序性能.
而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.
volatile原理是什么?
volatile的语义, 其实是奉告处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模子)
因此, 当多核或多线程在拜候该变量时, 都将直接操作主存, 这从本质上, 做到了变量同享.
volatile的有什么上风?
1, 更大的程序吞吐量
2, 更少的代码实现多线程
3, 程序的伸缩性较好
4, 对比好理解, 无需太高的学习本钱
volatile有什么劣势?
1, 简单出问题
2, 对比难计划
volatile运算存在脏数据问题
volatile仅仅能保证变量可见性, 无法保证原子性.
volatile的race condition示例:
public class TestRaceCondition {
private volatile int i = 0;
public void increase() {
i++;
}
public int getValue() {
return i;
}
}
当多线程履行increase办法时, 能否能保证它的值会是线性递增的呢?
答案能否定的.
缘由:
这里的increase办法, 履行的操作是i++, 即 i = i + 1;
针对i = i + 1, 在多线程中的运算, 本身需求改变i的值.
假如, 在i已从内存中取到最新值, 但未与1举行运算, 此时其他线程已数次将运算后果赋值给i.
则当前线程完毕时, 之前的数次运算后果都将被覆盖.
即, 履行100次increase, 大概后果是 < 100.
普通来说, 这种情形需求较高的压力与并发情形下, 才会呈现.
以上是“JAVA高级:多核线程-volatile原理与本领[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |