java中volatile不能保证线程安全(实例讲解)
2017-09-04 14:36
931 查看
今天打了打代码研究了一下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(); /* 同步的结果 Thread-2:----1 Thread-2:----3 Thread-0:----4 Thread-0:----6 Thread-3:----7 Thread-3:----9 Thread-1:----10 Thread-1:----12*/ /* 去掉同步的结果 Thread-0:----1 Thread-1:----2 Thread-2:----3 Thread-3:----4 Thread-0:----8 Thread-3:----10 Thread-1:----10 Thread-2:----12*/ } }
以上这篇java中volatile不能保证线程安全(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章推荐
- volatile不能保证原子性,也就不能保证线程安全
- java中volatile关键字的用法,它不能保证原子性操作
- Java线程-volatile不能保证原子性
- Java之多线程内存可见性_2(volatile不能保证原子性)
- java Executor线程池 中的Callable多线程讲解及实例
- volatile不能保证原子性
- Java反射讲解-实例(2)
- JSP+JavaBean+Servlet工作原理实例讲解
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- java 线程安全的理论讲解
- 通过实例讲解java中具备全程事务控制的JDBC连接管理器知识
- 通过一个实例,讲解java 中的类、方法和字段
- 实例讲解java中==和equals的区别
- volatile不能保证程序执行的原子性以及只能一定程度上保证有序性
- 实例讲解java的纯数字加密解密
- Java 线程实例讲解综述
- Java异常 Exception类及其子类(实例讲解)
- Java技巧:实例讲解Servlet的图象处理
- java线程的同步中notify和wait方法之生产消费实例讲解
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)