java中volatile不能保证线程安全(实例讲解)

 更新时间:2017年09月04日 14:36:01   作者:Think-007  
下面小编就为大家带来一篇java中volatile不能保证线程安全(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

今天打了打代码研究了一下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不能保证线程安全(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • ThreadLocal常用方法、使用场景及注意事项说明

    ThreadLocal常用方法、使用场景及注意事项说明

    这篇文章主要介绍了ThreadLocal常用方法、使用场景及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • JavaFX Application应用实例

    JavaFX Application应用实例

    下面小编就为大家带来一篇JavaFX Application应用实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java反射的作用知识点总结

    java反射的作用知识点总结

    在本篇文章里小编给大家整理的是关于java反射的作用知识点总结,需要的朋友们可以学习下。
    2020-02-02
  • Java实现非阻塞式服务器的示例代码

    Java实现非阻塞式服务器的示例代码

    这篇文章主要为大家详细介绍了如何利用Java实现一个简单的非阻塞式服务器,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-05-05
  • Java使用Socket判断某服务能否连通代码实例

    Java使用Socket判断某服务能否连通代码实例

    这篇文章主要介绍了Java使用Socket判断某服务能否连通代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    这篇文章主要介绍了SpringSecurity中的EnableWebSecurity注解启用Web安全详解,@EnableWebSecurity是Spring Security用于启用Web安全的注解,典型的用法是该注解用在某个Web安全配置类上,实现了接口,需要的朋友可以参考下
    2023-12-12
  • Java使用反射操作数组示例

    Java使用反射操作数组示例

    这篇文章主要介绍了Java使用反射操作数组,结合实例形式分析了基于java反射机制操作数组的创建、赋值、输出等相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • java字符串遍历以及统计字符串中各类字符

    java字符串遍历以及统计字符串中各类字符

    这篇文章主要为大家详细介绍了java字符串遍历以及字符串中各类字符统计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java concurrency之非公平锁_动力节点Java学院整理

    Java concurrency之非公平锁_动力节点Java学院整理

    本篇文章主要介绍了Java concurrency之非公平锁,详细的介绍了获取和释放非公平锁,有兴趣的同学可以了解一下
    2017-06-06
  • java网络之基于UDP的聊天程序示例解析

    java网络之基于UDP的聊天程序示例解析

    这篇文章主要介绍了java网络之基于UDP的聊天程序示例解析,文中通过步骤及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论