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


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

    转载  2017-09-04   作者:Think-007    我要评论

    下面小编就为大家带来一篇java中volatile不能保证线程安全(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而不是从缓存中读取的数据,附上代码如下,当synchronized去掉的时候,每个线程的结果是乱的,加上的时候结果才是正确的。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /**
     *
     * 类简要描述
     *
     * <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);
    //  }
     }
     
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    /**
     *
     * 类简要描述
     *
     * <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不能保证线程安全(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 相关阅读:
    Nginx模块fastcgi_cache的几个注意点 转
    CGI与FastCGI 转
    APUE--UNIX环境编程
    与 在记事本中的内容表现方式 原创
    Linux 内核使用的 GNU C 扩展
    GCC内嵌汇编
    linux下64位汇编的系统调用系列
    查看源码Vim+Cscope
    GCC 编绎选项 转
    Linux系统启动流程 图解
  • 原文地址:https://www.cnblogs.com/erma0-007/p/8646991.html
Copyright © 2020-2023  润新知