时间:2021-05-19
今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而不是从缓存中读取的数据,附上代码如下,当synchronized去掉的时候,每个线程的结果是乱的,加上的时候结果才是正确的。
/** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */public class VolatileThread implements Runnable { private volatile int a = 0; @Override public void run() { // TODO Auto-generated method stub// synchronized (this) { a = a + 1; System.out.println(Thread.currentThread().getName() + ":----" + a); try { Thread.sleep(100); a = a + 2; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":----" + a);// } }}/** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */public class VolatileMain { public static void main(String[] args) { VolatileThread s = new VolatileThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); Thread t3 = new Thread(s); Thread t4 = new Thread(s); t1.start(); t2.start(); t3.start(); t4.start(); }}以上这篇java中volatile不能保证线程安全(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
volatile变量提供了线程的可见性,并不能保证线程安全性和原子性。什么是线程的可见性: 锁提供了两种主要特性:互斥(mutualexclusion)和可见
java高并发中volatile的实现原理摘要:在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的syn
一、volatile关键字的语义分析1.保证可见性对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++)2.保证有序性3.volatile的原理和
volatile关键字在java多线程中有着比较重要作用,volatile主要作用是可以保持变量在多线程中是实时可见的,是java中提供的最轻量的同步机制。可见
本文实例分析了java多线程中的volatile和synchronized用法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:packagecom.