`
zhangwei_david
  • 浏览: 469170 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Volatile不能保证数据同步

阅读更多

    首先接受 java 的内存模型,在java 中每个线程都有自己的工作内存,如寄存器,高速缓存等,线程在写入的时候首先写入的是自己的工作内存中,然后在刷到主内存中,读取也是先从主内存加载到工作内存中,然后线程是从工作内存中获取。

    volatile 只能保证每次读写数据的时候都是对主内存进行操作,但是并不能保证该资源的同步。

 

 

/**
 *
 * @author zhangwei_david
 * @version $Id: UnsafeThread.java, v 0.1 2014年10月22日 下午10:18:11 zhangwei_david Exp $
 */
public class UnsafeThread implements Runnable {

    private volatile int count = 0;

    /**
     * @see java.lang.Runnable#run()
     */
    public void run() {
        // 执行耗时的计算
        for (int i = 0; i < 100; i++) {
            Math.hypot(Math.pow(92456789, i), Math.cos(i));
        }
        // 输出自增结果
        System.out.println(count++);

    }


}

/**
 *
 * @author zhangwei_david
 * @version $Id: UnsafeThreadTest.java, v 0.1 2014年10月22日 下午10:20:49 zhangwei_david Exp $
 */
public class UnsafeThreadTest {

    /**
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        int value = 1000;
        Thread.currentThread().getThreadGroup();

        UnsafeThread ut = new UnsafeThread();
        for (int i = 0; i < value; i++) {
            new Thread(ut).start();
        }

    }

}

        上述的代码结果预期是什么样的呢? 最大值是不是999呢?

2
0
1
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
90
93
89
95
94
92
97
98
99
91
101
102
104
105
106
108
110
100
111
112
114
115
116
117
96
120
119
122
118
124
113
109
107
103
125
123
126
121
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
207
206
208
210
209
211
212
213
214
215
216
217
218
220
219
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
275
274
276
277
278
280
279
281
283
282
284
285
286
288
287
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
373
372
374
375
376
377
380
379
378
381
382
383
385
384
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
405
404
406
408
407
409
410
411
412
413
415
414
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
524
523
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
565
563
564
567
566
568
569
570
571
573
572
574
575
576
577
579
578
580
581
582
583
585
584
586
587
588
589
590
591
592
593
594
595
729
728
727
726
725
724
723
722
721
720
719
718
717
716
715
714
713
712
711
710
709
708
707
706
705
704
703
702
701
700
699
698
697
695
696
694
693
691
692
690
689
688
687
686
685
684
683
682
681
680
679
678
677
676
675
674
673
672
671
670
669
668
667
666
665
664
663
662
661
660
659
658
657
656
655
654
653
652
651
650
649
648
647
646
645
644
643
642
641
640
639
638
637
636
635
634
633
632
631
630
629
628
627
626
624
625
623
622
621
620
619
618
617
616
615
614
613
613
612
611
610
609
608
607
606
605
604
603
602
601
600
599
598
597
596
751
750
749
748
747
746
745
744
743
742
741
740
739
738
737
736
735
734
733
732
731
730
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
787
786
788
789
790
791
792
793
794
795
796
797
798
799
802
801
800
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
940
939
941
943
942
944
945
946
947
948
949
950
951
952
953
954
955
956
958
957
959
960
961
962
963
964
965
966
967
968
969
970
971
972
974
973
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
996
995
997
998

 

通过上述的结果可以发现最后的结果是998

 

 

 

0
0
分享到:
评论
1 楼 BazingaLyn 2015-11-11  
我觉得你写的不对,根据顺序是无法判定volatile是否是数据同步,应该看最后的最大值是不是等于1000,volatile只是保证数据一致性,数据同步必须是加锁

相关推荐

    C#中volatile与lock用法

    volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...

    C++大厂面试真题宝典 精选100道完结7章

    volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。 volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的...

    Java并发volatile关键字.docx

    synchronized是阻塞式同步,在线程...这个实际对普通变量没有规定的,而针对volatile修饰的变量给Java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读,从而保证数据的可见性。

    Java并发:volatile内存可见性和指令重排

     此外需注意volatile并不保证操作的原子性。  (一)内存可见性  1 概念  JVM内存模型:主内存和线程独立的工作内存  Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立...

    线程安全在Java中的应用与实践.pptx.pptx

    volatile关键字可以保证变量的可见性,当一个线程修改了volatile变量的值,新值对于其他线程来说是立即可见的,这样可以防止由于线程间的数据不一致导致的问题 Lock接口 Lock接口提供了比synchronized关键字更广泛的...

    深入理解java内存模型

    为什么final引用不能从构造函数内“逸出” final语义在处理器中的实现 JSR-133为什么要增强final的语义 总结 处理器内存模型 JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR...

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    为什么 final 引用不能从构造函数内“逸出” 63 final 语义在处理器中的实现 65 JSR-133 为什么要增强 final 的语义 65 总结 66 处理器内存模型 66 JMM,处理器内存模型与顺序一致性内存模型之间的关系 68 JMM...

    JavaMultiThread

    关键字 synchronized, volatile既然volatile关键字已经实现了线程间数据...synchronized则可以使用在变量、方法、和类级别的3).volatile仅能实现变量的修改可见性,并能不能保证原子性(如果一段代码被认为是Atomic,

    java多线程安全性基础介绍.pptx

    由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 各线程之间变量不可见,线程通信通过共享主内存实现。 volatile 仅保证可见性 作用 不会被缓存在寄存器或其他对cpu不...

    [Java] volatile 详详解!

    要真正搞懂volatile的特性需要与JMM对比来看 JMM(线程安全的保证) JMM:JAVA内存模型(java memory model) 是一种抽象概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(实例...

    atomicReference 使用和AtomicStampedReference 解决ABA的问题.docx

    volatile修饰的变量,保证前俩者 CAS算法,也就是cpu级别的同步指令,相当于乐观锁,它可以探测到其他线程对共享数据的变化情况\ cas带来一个ABA问题 什么是ABA呢? 就是俩个线程同事操作,有可能有一个线程已经处理结束,...

    sesvc.exe 阿萨德

    因此通常建议能提前预估 HashMap 的大小最好,尽量的减少扩容带来的性能损耗。 根据代码可以看到其实真正存放数据的是 transient Entry,V&gt;[] table = (Entry,V&gt;[]) EMPTY_TABLE; 这个数组,那么它又是如何定义的...

    java面试800题

    volatile:volatile变量表示保证它必须是与主内存保持一致,它实际是""变量的同步"", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前,一般用于多线程编程。 abstract:抽象,必须重载,修饰...

    Java并发编程原理与实战

    实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具...

    java经典面试2010集锦100题(不看你后悔)

    B) 在Java中布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在...

    Java常见面试题208道.docx

    34.怎么确保一个集合不能被修改? 三、多线程 35.并行和并发有什么区别? 36.线程和进程的区别? 37.守护线程是什么? 38.创建线程有哪几种方式? 39.说一下 runnable 和 callable 有什么区别? 40.线程有哪些状态?...

    C++ 原子类型

    原子对象可以保证:从不同的线程访问其包含的数据不会造成数据竞争。此外,它还能够同步不同线程对内存的访问。 atomic 构造 default (1) atomic() noexcept = default; initialization (2) constexpr atomic...

    龙果 java并发编程原理实战

    第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第...

    Java 并发编程原理与实战视频

    第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第...

Global site tag (gtag.js) - Google Analytics