volatile关键字是不是能保证线程安全

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile关键字是不是能保证线程安全相关的知识,希望对你有一定的参考价值。

volatile不是保护线程安全的。
它保护的是变量安全。主要的功能是保护变量不被主函数和中断函数反复修改造成读写错误。
参考技术A 只能保证不被编译器优化。不能保证线程安全。完全是两码事。

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

以上是关于volatile关键字是不是能保证线程安全的主要内容,如果未能解决你的问题,请参考以下文章

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

volatile关键字能否保证线程安全?

[冬竹学Java]——volatile浅析

volatile关键字

volatile为啥不能保证原子性

JAVA并发编程递进篇,探索线程安全性volatile关键字如何保证可见性