山西建设厅八大员查询网站设计师图片素材网站有哪些
山西建设厅八大员查询网站,设计师图片素材网站有哪些,网站建设 软件有哪些方面,网址地址查询域名volatile 关键字 #xff08;二#xff09; 文章目录 volatile 关键字 #xff08;二#xff09;volatile 可以保证原子性么#xff1f; 文章来自Java Guide 用于学习如有侵权#xff0c;立即删除 volatile 可以保证原子性么#xff1f;
volatile 关键字能保证变量的可…volatile 关键字 二 文章目录 volatile 关键字 二volatile 可以保证原子性么 文章来自Java Guide 用于学习如有侵权立即删除 volatile 可以保证原子性么
volatile 关键字能保证变量的可见性但不能保证对变量的操作是原子性的。
我们通过下面的代码即可证明
/*** 微信搜 JavaGuide 回复面试突击即可免费领取个人原创的 Java 面试手册** author Guide哥* date 2022/08/03 13:40**/
public class VolatoleAtomicityDemo {public volatile static int inc 0;public void increase() {inc;}public static void main(String[] args) throws InterruptedException {ExecutorService threadPool Executors.newFixedThreadPool(5);VolatoleAtomicityDemo volatoleAtomicityDemo new VolatoleAtomicityDemo();for (int i 0; i 5; i) {threadPool.execute(() - {for (int j 0; j 500; j) {volatoleAtomicityDemo.increase();}});}// 等待1.5秒保证上面程序执行完成Thread.sleep(1500);System.out.println(inc);threadPool.shutdown();}
}正常情况下运行上面的代码理应输出 2500。但你真正运行了上面的代码之后你会发现每次输出结果都小于 2500。
为什么会出现这种情况呢不是说好了volatile 可以保证变量的可见性嘛
也就是说如果 volatile 能保证 inc 操作的原子性的话。每个线程中对 inc 变量自增完之后其他线程可以立即看到修改后的值。5 个线程分别进行了 500 次操作那么最终 inc 的值应该是 5*5002500。
很多人会误认为自增操作 inc 是原子性的实际上inc 其实是一个复合操作包括三步
读取 inc 的值。对 inc 加 1。将 inc 的值写回内存。
volatile 是无法保证这三个操作是具有原子性的有可能导致下面这种情况出现
线程 1 对 inc 进行读取操作之后还未对其进行修改。线程 2 又读取了 inc的值并对其进行修改1再将inc 的值写回内存。线程 2 操作完毕后线程 1 对 inc的值进行修改1再将inc 的值写回内存。
这也就导致两个线程分别对 inc 进行了一次自增操作后inc 实际上只增加了 1。
其实如果想要保证上面的代码运行正确也非常简单利用 synchronized、Lock或者AtomicInteger都可以。
使用 synchronized 改进
public synchronized void increase() {inc;
}使用 AtomicInteger 改进
public AtomicInteger inc new AtomicInteger();public void increase() {inc.getAndIncrement();
}使用 ReentrantLock 改进
Lock lock new ReentrantLock();
public void increase() {lock.lock();try {inc;} finally {lock.unlock();}
}大家好我是xwhking一名技术爱好者目前正在全力学习 Java前端也会一点如果你有任何疑问请你评论或者可以加我QQ2837468248说明来意希望能够与你共同进步
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86574.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!