码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-03-25 21:44:21      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:脚本   string   method   inter   article   结果   线程   rup   技术   

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

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

标签:脚本   string   method   inter   article   结果   线程   rup   技术   

原文地址:https://www.cnblogs.com/erma0-007/p/8646991.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!