`
zhangwei_david
  • 浏览: 476983 次
  • 性别: 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只是保证数据一致性,数据同步必须是加锁

相关推荐

    Volatile详解,深入学习Volatile

    - 对于复杂的数据结构,如数组、结构体,volatile只能保证单个变量的可见性,不能保证整个数据结构的一致性。 - volatile不能解决并发下的线程安全问题,还需要配合锁机制来实现。 总结来说,volatile是编程中一...

    C#中volatile与lock用法

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

    volatile用法

    这意味着变量的值不能被程序修改,但可能在运行时被其他不受程序控制的因素改变。例如,某些只读的硬件寄存器就是这样的例子。 3. `volatile`与指针: 指针也可以声明为`volatile`。这表示指针本身(存储地址的...

    volatile 变量的说明

    例如,如果你有一个计数器并尝试通过多个线程同时递增,volatile并不能保证递增操作的原子性,因此仍然需要使用synchronized或者其他并发控制机制来保证。 下面是一些关于volatile的常见问题及其解答: 1. **参数...

    volatile源码分析1

    而volatile保证了b的赋值不会被重排到a之前,确保线程B在看到b变化的同时,也看到了a的变化。 2. 内存可见性 内存可见性是指当一个线程修改了共享变量后,其他线程能够立即看到这个修改。在Java中,volatile变量的...

    volatile,nonatomic和atomic关键字测试

    但是,`atomic`并不能保证数据的一致性,特别是在多个线程同时修改同一属性时。另一方面,`nonatomic`表示非原子性,它不提供线程保护,因此在多线程环境中,访问`nonatomic`属性可能会导致数据不一致,但它的优点是...

    Java并发编程:volatile关键字解析

    - **非原子性**:需要注意的是,虽然`volatile`关键字提供了可见性和有序性保证,但它并不能保证复合操作的原子性。例如,对于`i++`这样的操作,即使`i`是`volatile`变量,该操作也不是原子性的。 #### 五、使用...

    volatile的作用

    当多个线程访问同一个变量时,为了保证数据的一致性和可见性,可以使用`volatile`关键字。例如,在多线程环境中,如果一个线程修改了一个变量,而另一个线程需要读取这个变量,那么必须确保读取到的是最新的值。`...

    单片机C语言中volatile的作用

    使用`volatile`关键字可以帮助避免一些基本的同步问题,但需要注意的是,它并不能完全解决所有并发问题,还需要结合其他同步手段一起使用。 #### 面试中的`volatile`问题 接下来,我们将通过几个具体的面试问题来...

    volatile的使用1

    【volatile关键字】在Java编程语言中扮演着至关重要的角色,主要负责解决并发环境下的数据同步问题。volatile确保了变量在多线程环境下的可见性和有序性,但它并不保证原子性。 1. **可见性**:当一个线程修改了...

    C语言中关于关键字volatile的用法

    尽管如此,在使用volatile时也要注意,它并不是万能的,比如它并不能替代锁机制来保证多线程间的同步。对于复杂的同步问题,还需要结合其他多线程编程技术来解决。 最后,回到示例代码中的问题,使用volatile变量时...

    volatile关键字使用

    虽然它不能替代锁机制,但可以确保一个线程修改后的值能立即被其他线程看到。然而,仅使用`volatile`无法保证原子性,如果多个线程同时修改一个`volatile`变量,仍可能出现竞态条件。 3. **硬件交互**:在与硬件...

    从汇编角度理解volatile

    在多线程环境中,线程间共享的变量通常需要加锁来保证数据一致性。例如,我们有一段使用互斥锁的C代码(mutex.c)。在这个例子中,`g_i`是全局变量,两个线程分别对其进行修改。即使不使用volatile,由于每次访问...

    聊聊并发(一)深入分析Volatile的实现原理

    在并发编程领域,Volatile是Java中一个非常关键的特性,它为共享变量提供了内存可见性和有序性保证,但不保证原子性。本篇文章将深入分析Volatile的实现原理,结合`LinkedTransferQueue`和`TransferQueue`这两个与...

    Java并发编程系列- volatile

    Java并发编程中的`volatile`关键字是一个非常重要的概念,它用于解决多线程环境下的数据同步问题。`volatile`关键字提供了两种关键特性: 1. **保证可见性**:当一个线程修改了`volatile`变量,这个修改对于其他...

    Volatile的陷阱.pdf

    总的来说,volatile的正确使用需要理解其语义和编译器行为,避免误用可能导致的优化错误和数据同步问题。在多线程编程中,应当结合锁、原子操作等机制来确保数据一致性。对于嵌入式系统和驱动开发,合理地使用...

    java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx

    ### Java入门教程:数据类型与正确使用Volatile变量 #### 概述 在Java编程语言中,`volatile`关键字提供了一种轻量级的同步机制,用于确保共享变量的可见性和一定程度上的线程安全性。相比于传统的锁机制如`...

    一文精通Java中的volatile关键字

    虽然`volatile`提供了轻量级的同步机制,但它并不具备`synchronized`的锁机制,无法保证原子性。例如,对于`flag = true;`这样的单次赋值操作,`volatile`可以保证其原子性,但对于`flag++`这样的复合操作,由于可能...

Global site tag (gtag.js) - Google Analytics