-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathjava-memory-model.html
More file actions
867 lines (755 loc) · 244 KB
/
Copy pathjava-memory-model.html
File metadata and controls
867 lines (755 loc) · 244 KB
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
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
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
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
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
523
524
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
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
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
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
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
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Java内存模型与并发编程 | Jeskson-微服务分布式</title>
<meta name="generator" content="VuePress 1.9.10">
<meta name="description" content="Jeskson文档-架构师">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<link rel="preload" href="/JavaPlusDoc/assets/css/0.styles.69a89f58.css" as="style"><link rel="preload" href="/JavaPlusDoc/assets/js/app.ff4b1912.js" as="script"><link rel="preload" href="/JavaPlusDoc/assets/js/7.dfc0397a.js" as="script"><link rel="preload" href="/JavaPlusDoc/assets/js/2.cfbace72.js" as="script"><link rel="preload" href="/JavaPlusDoc/assets/js/1.d59a348b.js" as="script"><link rel="preload" href="/JavaPlusDoc/assets/js/525.c768492d.js" as="script"><link rel="prefetch" href="/JavaPlusDoc/assets/js/10.8af913bb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/100.2c53fcbd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/101.8ccd9f40.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/102.6abe231e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/103.0e437ead.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/104.d915d7e5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/105.5d55ab62.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/106.07d5a34b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/107.513f25ac.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/108.7cda8012.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/109.b70451e6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/11.7e3aeb50.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/110.b8dbdfb8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/111.71acaa8b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/112.ca35903a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/113.2db92a40.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/114.6e775813.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/115.d4fcd4df.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/116.5fbd9309.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/117.67d2a408.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/118.458ec435.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/119.044db67a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/120.433d403c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/121.4a247941.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/122.edf76321.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/123.24f157cc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/124.8d2eafc2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/125.9fcad17b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/126.ea0c1e50.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/127.eb6e5a6c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/128.c37745dd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/129.d42e1da1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/130.1f940759.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/131.f048f51b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/132.f2e05b7b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/133.1025c747.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/134.e986b5c6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/135.ee67ecb2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/136.51486790.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/137.7afd61da.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/138.a9b7f1d5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/139.b0abdadb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/140.928f8b9d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/141.75ac97ba.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/142.e4a40851.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/143.abb68380.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/144.4a31149b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/145.4a204821.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/146.df6efac7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/147.35f39f6d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/148.8f687af8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/149.75598127.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/15.ab64ce54.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/150.7c950dfa.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/151.1a568fbd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/152.39d4b618.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/153.f7912ca4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/154.a7e8c404.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/155.11719bb5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/156.b0f61c27.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/157.78f0d5ec.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/158.96bd7aa7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/159.c826f336.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/16.5859debf.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/160.79fcd999.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/161.6e041a18.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/162.c1dd8613.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/163.ab44d65f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/164.55f30c4b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/165.1945cc91.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/166.7ce08c0a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/167.39902e9e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/168.0a015885.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/169.68d1a118.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/17.f3af3709.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/170.284bccfc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/171.8abc7f27.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/172.1fda5d51.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/173.bb2d4d2b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/174.b34f63a3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/175.28b93c68.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/176.7c670e26.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/177.5163bae9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/178.51467a77.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/179.9738c734.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/18.7387f7e6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/180.ec8da569.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/181.321020b2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/182.eaa16e7a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/183.fd9bacb6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/184.987ef50e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/185.65f18305.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/186.ece5c753.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/187.b0e4a1ac.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/188.5ac430dd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/189.e5a35218.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/19.f4fea483.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/190.0d633d69.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/191.cb84e758.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/192.5696bda6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/193.c152ca1b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/194.58104929.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/195.f5268146.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/196.09b66f73.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/197.ac23f446.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/198.261200a2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/199.724aa135.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/20.070d4a3f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/200.2fc8b0b5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/201.8d7b1f57.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/202.b803e840.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/203.2eff0b6c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/204.d5a4c7c6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/205.88bbae92.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/206.cd68581c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/207.85c260ec.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/208.fd085d80.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/209.d2453e08.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/21.78933f38.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/210.116334ba.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/211.345d1772.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/212.1a27f8c9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/213.59877e34.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/214.6480dee2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/215.70ae1d89.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/216.09ca4312.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/217.af7bdf8c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/218.02a40cca.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/219.f484832f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/22.4753ae4d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/220.6ba39f2b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/221.d585a6e3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/222.557543ae.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/223.5140b6e5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/224.eaa0e691.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/225.356a94a3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/226.fc10b75b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/227.9af00c34.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/228.4dc3c41b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/229.d11b02a5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/23.5ad2a326.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/230.519fdeb6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/231.680b752e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/232.1adf38e1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/233.fcc3e8cc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/234.7295f17c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/235.860622cd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/236.07a1c33e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/237.8b3b18c5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/238.02b07b10.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/239.4b1eaae1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/24.d8ef76cb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/240.7a378249.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/241.50826979.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/242.a827cb6e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/243.02ee6149.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/244.95a1f931.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/245.839cc4a8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/246.a8298108.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/247.17c29ff6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/248.076346b6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/249.a5694c3b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/25.56c87efe.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/250.db53d9fa.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/251.e5678920.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/252.4a97a73b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/253.fab94cc6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/254.f6fe60a9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/255.5c90176f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/256.51b253fa.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/257.7545eceb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/258.d30ea980.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/259.19f6dd5e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/26.e137a506.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/260.b45fa309.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/261.b82f3b68.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/262.66dbb3e0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/263.1bd0b88a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/264.e2d16987.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/265.a999dac8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/266.0e3ffc82.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/267.31bcc9c4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/268.21cadd7e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/269.6d41a49b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/27.8fd1e34f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/270.cdc34c03.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/271.14d67f07.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/272.6b7ef511.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/273.29143d7e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/274.98c8d414.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/275.fcbb9b74.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/276.57d87a0b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/277.f32479eb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/278.6c8f70ff.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/279.ee430fb0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/28.ec80e187.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/280.6482b349.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/281.a146cd78.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/282.859de97e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/283.c15404e4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/284.01dad2ca.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/285.619be44a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/286.d242787c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/287.c87ab04d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/288.e030d44a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/289.59a5a660.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/29.a2b39230.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/290.eab48a51.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/291.1f4b1e47.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/292.a13c9a99.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/293.b4eb7ce5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/294.d4abf953.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/295.8daf6058.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/296.368c24d4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/297.3f74b182.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/298.6988474c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/299.dfad3465.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/3.40e3acc6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/30.9a11650a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/300.17321217.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/301.d9a1826e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/302.09a7987d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/303.5025013f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/304.d4b8a3d1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/305.159772d2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/306.24c63e31.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/307.e6a6d270.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/308.4e507498.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/309.aee111c8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/31.874f8153.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/310.5f1b5ca1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/311.34ae5cb3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/312.c43ea236.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/313.b847ec00.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/314.d64f5684.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/315.7d106bd1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/316.867e71e0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/317.494bb25c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/318.b855401a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/319.6ac2e09f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/32.ee0b114a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/320.5c40f84e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/321.f2cf33ad.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/322.3fa8fc56.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/323.8a4d04ec.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/324.8105e17f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/325.2550dcad.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/326.c3ff61c8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/327.3a7ecc7c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/328.fed3b915.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/329.827908ae.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/33.cd82de30.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/330.937816d2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/331.c852bfdf.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/332.c505b6c7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/333.bef6e033.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/334.08a55ffe.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/335.6b268219.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/336.82d3fb2a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/337.39956547.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/338.6136640d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/339.81f5ad5b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/34.9c90a2a7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/340.48782f66.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/341.d47516d3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/342.4436bb4a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/343.908c9bd3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/344.697ee8bd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/345.ab9f1f75.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/346.076fd1c5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/347.3be42a59.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/348.97ba33db.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/349.3c07d100.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/35.d8543719.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/350.ec1bc3db.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/351.9d3153e4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/352.e71317f4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/353.261cb101.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/354.f3e47221.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/355.b307a3ed.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/356.b38d86c2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/357.d1d9dc9d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/358.a03fc094.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/359.6b15776d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/36.ca9f16ca.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/360.bb0c54dd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/361.35cefb19.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/362.56d3b2f7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/363.86a26ed2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/364.94d338d5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/365.07637682.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/366.575090a7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/367.a24af406.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/368.84aaad95.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/369.878f8b2f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/37.21403d6a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/370.dd867f9d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/371.dd80e718.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/372.c7b54b81.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/373.e2554640.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/374.b9b710d2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/375.c9ad50e0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/376.9b86837b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/377.05760818.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/378.12ec82d0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/379.173b0296.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/38.bc6b1c3c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/380.d0bdf0e1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/381.79d7a925.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/382.2c726e6e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/383.c3692568.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/384.7d008b7d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/385.08ce6856.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/386.12bb7596.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/387.4ee785b3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/388.ebe74e39.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/389.05b70f9b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/39.8a7f24eb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/390.bdcfda98.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/391.5f2295e0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/392.8e12903a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/393.c553ee9b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/394.142fba6a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/395.2330c45a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/396.a7c9d0aa.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/397.e8412077.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/398.464f44c4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/399.aaa72c53.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/4.8b5d3c01.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/40.98ac2f84.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/400.154963b8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/401.894a8c6f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/402.8f683588.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/403.b8dbd9cb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/404.fc97c865.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/405.398fff13.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/406.ada3f6c6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/407.46666ee3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/408.39295bc5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/409.00710db4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/41.b36c815d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/410.0cb22004.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/411.e5923416.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/412.f58d3da9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/413.0f6f7f8b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/414.015eb6b2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/415.b155b195.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/416.3244bedb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/417.26b9b844.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/418.37dd3bda.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/419.4a64bc57.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/42.8c4dfaf7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/420.15ff5f8b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/421.988f32c6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/422.75528a99.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/423.366db802.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/424.508f7b6c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/425.6f763bb5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/426.659742ea.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/427.8b3d75d8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/428.2f29aadb.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/429.2f28db07.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/43.815d0502.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/430.abf10612.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/431.9e64562c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/432.99f2f904.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/433.6296d93e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/434.f7904247.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/435.98715d2d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/436.9fefac84.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/437.fea151e9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/438.7191b005.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/439.f3ccd045.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/44.ba19f402.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/440.2de0c08c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/441.8e3cb7b2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/442.b93b4817.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/443.39c48a3a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/444.1655e664.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/445.97e47e06.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/446.d2adebf8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/447.4be86ce4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/448.0b587761.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/449.ddf18f4c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/45.4182ef1e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/450.28fa53ca.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/451.ef5b2bd0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/452.e121c917.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/453.c8132e49.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/454.2432fab6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/455.34584ef6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/456.9903968f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/457.63aa6849.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/458.0b9d9b23.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/459.9f021166.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/46.2a154851.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/460.a629ff70.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/461.d75e8448.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/462.552a8aef.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/463.ec331fd1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/464.1890b541.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/465.2a0bd1b9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/466.610de9f1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/467.2d46b708.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/468.04a56bcc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/469.7d6a224c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/47.9b096bd4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/470.da81c67e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/471.e592f995.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/472.bc085169.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/473.0cb79355.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/474.7f396d93.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/475.e2adea36.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/476.8b82e0ff.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/477.8bd4fa06.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/478.3fa4b579.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/479.6029394b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/48.fff8acb7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/480.1eb05b6f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/481.18496764.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/482.11a56dce.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/483.285ea6df.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/484.b15c921d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/485.53d859c3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/486.4680c312.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/487.2376b70e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/488.bd4ff8a8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/489.7c19b407.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/49.510ceb1b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/490.5c95e6f9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/491.c22e75d5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/492.e7342ffc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/493.7e251855.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/494.b4a9a5ea.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/495.36fc9e68.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/496.7616b0ef.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/497.a627b99d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/498.e6ec30be.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/499.9f8c621b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/5.dd2e9586.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/50.1c015ec1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/500.e4f04fa7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/501.23e805ce.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/502.c7707c65.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/503.3f577d77.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/504.5fd17fd2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/505.0e03be2a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/506.e87bada7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/507.2b245401.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/508.87b73a39.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/509.cc69075a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/51.fa0d4ce8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/510.6490c5fe.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/511.be7a1d82.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/512.c680c2c9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/513.36b29e3e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/514.d3ae3a27.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/515.cdb5681f.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/516.469418ff.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/517.24928bff.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/518.6a26365b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/519.59e59dea.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/52.03c9ff54.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/520.23673bd1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/521.a5806db8.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/522.73be9af3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/523.0e7e4925.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/524.327700e3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/526.febcc9d9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/527.dd5fd0b5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/528.7e1d4ec5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/529.8bdce1a4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/53.7e80043a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/530.44e010d9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/531.f67a86b7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/532.09b7ead5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/533.7adabdfa.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/534.f868f74a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/535.c98d4c0e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/536.370ce042.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/537.753a8af1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/538.d017f77d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/539.a133376e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/54.f7955daf.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/540.f4dbc9d0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/55.686f3985.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/56.cb0430ac.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/57.eb834e65.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/58.bf089253.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/59.14efcce4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/6.bab6d49b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/60.eaf6e3a4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/61.3bbdc790.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/62.38f6d5ec.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/63.02f1b305.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/64.1722673d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/65.6547e007.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/66.4e8931dc.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/67.cfca24ed.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/68.8add83f1.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/69.1693fd1e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/70.179cc187.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/71.313fbab6.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/72.0e0d03ef.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/73.9b65b544.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/74.b4c4befd.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/75.f2ffd04c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/76.d8a485ae.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/77.df0cc69e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/78.63985859.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/79.1b530da0.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/8.482e3594.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/80.48deda5a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/81.26d7dd05.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/82.526c2b16.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/83.a00c4a7e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/84.f55a4b6a.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/85.62ab46e7.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/86.82d619c9.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/87.e726803b.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/88.a864fe77.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/89.dee71f5d.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/9.cb5e384c.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/90.f1aadb95.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/91.94144a2e.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/92.72d39ce5.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/93.b68bfc16.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/94.8957be11.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/95.eb9d19f3.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/96.093d0db2.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/97.5ba97253.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/98.6bf338d4.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/99.ba035d72.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/vendors~docsearch.0b3f4b62.js"><link rel="prefetch" href="/JavaPlusDoc/assets/js/vendors~flowchart.2a4bfc54.js">
<link rel="stylesheet" href="/JavaPlusDoc/assets/css/0.styles.69a89f58.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container" data-v-7dd95ae2><div data-v-7dd95ae2><div class="password-shadow password-wrapper-out" style="display:none;" data-v-59e6cb88 data-v-7dd95ae2 data-v-7dd95ae2><h3 class="title" data-v-59e6cb88>Jeskson-微服务分布式</h3> <p class="description" data-v-59e6cb88>Jeskson文档-架构师</p> <label id="box" class="inputBox" data-v-59e6cb88><input type="password" value="" data-v-59e6cb88> <span data-v-59e6cb88>Konck! Knock!</span> <button data-v-59e6cb88>OK</button></label> <div class="footer" data-v-59e6cb88><span data-v-59e6cb88><i class="iconfont reco-theme" data-v-59e6cb88></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-59e6cb88>vuePress-theme-reco</a></span> <span data-v-59e6cb88><i class="iconfont reco-copyright" data-v-59e6cb88></i> <a data-v-59e6cb88><!---->
<!---->
2025
</a></span></div></div> <div class="hide" data-v-7dd95ae2><header class="navbar" data-v-7dd95ae2><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/JavaPlusDoc/" class="home-link router-link-active"><!----> <span class="site-name">Jeskson-微服务分布式</span></a> <div class="links"><div class="color-picker"><a class="color-button"><i class="iconfont reco-color"></i></a> <div class="color-picker-menu" style="display:none;"><div class="mode-options"><h4 class="title">Choose mode</h4> <ul class="color-mode-options"><li class="dark">dark</li><li class="auto active">auto</li><li class="light">light</li></ul></div></div></div> <div class="search-box"><i class="iconfont reco-search"></i> <input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/JavaPlusDoc/" class="nav-link"><i class="undefined"></i>
首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
学习路线
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/" class="nav-link"><i class="undefined"></i>
入门指南
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/basic-grammar/basic-data-type.html" class="nav-link"><i class="undefined"></i>
基础到进阶
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
架构师成长
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
刷题练习
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/" class="nav-link"><i class="undefined"></i>
🎯 题库首页
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/topics/" class="nav-link"><i class="undefined"></i>
📚 专题练习
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/written-exam/" class="nav-link"><i class="undefined"></i>
📝 笔试真题
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/interview/" class="nav-link"><i class="undefined"></i>
💼 面试真题
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/contest/" class="nav-link"><i class="undefined"></i>
🏆 竞赛题库
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/statistics/" class="nav-link"><i class="undefined"></i>
📊 刷题统计
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
技术分类
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/basic-grammar/basic-data-type.html" class="nav-link"><i class="undefined"></i>
Java基础
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/java-up/nginx.html" class="nav-link"><i class="undefined"></i>
Java进阶
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/go/" class="nav-link"><i class="undefined"></i>
GO语言技术
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/iot/" class="nav-link"><i class="undefined"></i>
物联网架构
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
分布式架构
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/worker/1.html" class="nav-link"><i class="undefined"></i>
微服务
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/mysql/mysql.html" class="nav-link"><i class="undefined"></i>
数据库
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/sql/" class="nav-link"><i class="undefined"></i>
SQL专属手册
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/linux/linux.html" class="nav-link"><i class="undefined"></i>
运维与部署
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/docker/docker-tutorial.html" class="nav-link"><i class="undefined"></i>
Docker
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/uniapp/充电宝小程序实现.html" class="nav-link"><i class="undefined"></i>
UniApp小程序
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/products/" class="nav-link"><i class="undefined"></i>
产品系列
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
实战案例
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/worker/1.html" class="nav-link"><i class="undefined"></i>
系统设计
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
性能优化
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/java-up/nginx.html" class="nav-link"><i class="undefined"></i>
项目实践
</a></li><li class="dropdown-item"><!----> <a href="https://1024bibi.com/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
📝 简历制作工具
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
资源
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://webvueblog.github.io/JavaPlusDoc/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
官方文档
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://github.com/webVueBlog/JavaPlusDoc" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
GitHub仓库
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://github.com/webVueBlog" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
作者主页
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/wechat-contact-demo.html" class="nav-link"><i class="undefined"></i>
微信联系
</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask" data-v-7dd95ae2></div> <aside class="sidebar" data-v-7dd95ae2><div class="personal-info-wrapper" data-v-1fad0c41 data-v-7dd95ae2><!----> <!----> <div class="num" data-v-1fad0c41><div data-v-1fad0c41><h3 data-v-1fad0c41>496</h3> <h6 data-v-1fad0c41>文章</h6></div> <div data-v-1fad0c41><h3 data-v-1fad0c41>22</h3> <h6 data-v-1fad0c41>标签</h6></div></div> <ul class="social-links" data-v-1fad0c41></ul> <hr data-v-1fad0c41></div> <nav class="nav-links"><div class="nav-item"><a href="/JavaPlusDoc/" class="nav-link"><i class="undefined"></i>
首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
学习路线
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/" class="nav-link"><i class="undefined"></i>
入门指南
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/basic-grammar/basic-data-type.html" class="nav-link"><i class="undefined"></i>
基础到进阶
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
架构师成长
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
刷题练习
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/" class="nav-link"><i class="undefined"></i>
🎯 题库首页
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/topics/" class="nav-link"><i class="undefined"></i>
📚 专题练习
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/written-exam/" class="nav-link"><i class="undefined"></i>
📝 笔试真题
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/interview/" class="nav-link"><i class="undefined"></i>
💼 面试真题
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/contest/" class="nav-link"><i class="undefined"></i>
🏆 竞赛题库
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/coding-practice/statistics/" class="nav-link"><i class="undefined"></i>
📊 刷题统计
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
技术分类
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/basic-grammar/basic-data-type.html" class="nav-link"><i class="undefined"></i>
Java基础
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/java-up/nginx.html" class="nav-link"><i class="undefined"></i>
Java进阶
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/go/" class="nav-link"><i class="undefined"></i>
GO语言技术
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/iot/" class="nav-link"><i class="undefined"></i>
物联网架构
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
分布式架构
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/worker/1.html" class="nav-link"><i class="undefined"></i>
微服务
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/mysql/mysql.html" class="nav-link"><i class="undefined"></i>
数据库
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/sql/" class="nav-link"><i class="undefined"></i>
SQL专属手册
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/linux/linux.html" class="nav-link"><i class="undefined"></i>
运维与部署
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/docker/docker-tutorial.html" class="nav-link"><i class="undefined"></i>
Docker
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/uniapp/充电宝小程序实现.html" class="nav-link"><i class="undefined"></i>
UniApp小程序
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/products/" class="nav-link"><i class="undefined"></i>
产品系列
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
实战案例
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/worker/1.html" class="nav-link"><i class="undefined"></i>
系统设计
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="nav-link"><i class="undefined"></i>
性能优化
</a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/java-up/nginx.html" class="nav-link"><i class="undefined"></i>
项目实践
</a></li><li class="dropdown-item"><!----> <a href="https://1024bibi.com/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
📝 简历制作工具
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
资源
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://webvueblog.github.io/JavaPlusDoc/" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
官方文档
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://github.com/webVueBlog/JavaPlusDoc" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
GitHub仓库
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="https://github.com/webVueBlog" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="undefined"></i>
作者主页
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="/JavaPlusDoc/wechat-contact-demo.html" class="nav-link"><i class="undefined"></i>
微信联系
</a></li></ul></div></div> <!----></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><a href="/JavaPlusDoc/" class="sidebar-heading clickable router-link-active"><span>文档指南</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/" aria-current="page" class="sidebar-link">学前必读</a></li><li><a href="/JavaPlusDoc/encrypted-article.html" class="sidebar-link">加密文章示例</a></li><li><a href="/JavaPlusDoc/plugin-demo.html" class="sidebar-link">插件功能演示</a></li><li><a href="/JavaPlusDoc/share-demo.html" class="sidebar-link">社交分享功能演示</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>后端专属笔记</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>达达JAVA基础问答</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/basic/1.html" class="sidebar-link">第1天-第一个程序</a></li><li><a href="/JavaPlusDoc/basic/2.html" class="sidebar-link">第2天-基础语法</a></li><li><a href="/JavaPlusDoc/basic/3.html" class="sidebar-link">第3天-基本概念</a></li><li><a href="/JavaPlusDoc/basic/4.html" class="sidebar-link">第4天-基本数据类型</a></li><li><a href="/JavaPlusDoc/basic/5.html" class="sidebar-link">第5天-变量的声明实例</a></li><li><a href="/JavaPlusDoc/basic/6.html" class="sidebar-link">第6天-变量命名规则</a></li><li><a href="/JavaPlusDoc/basic/7.html" class="sidebar-link">第7天-修饰符</a></li><li><a href="/JavaPlusDoc/basic/8.html" class="sidebar-link">第8天-运算符</a></li><li><a href="/JavaPlusDoc/basic/9.html" class="sidebar-link">第9天-循环结构</a></li><li><a href="/JavaPlusDoc/basic/10.html" class="sidebar-link">第10天-条件语句</a></li><li><a href="/JavaPlusDoc/basic/11.html" class="sidebar-link">第11天-switch-case</a></li><li><a href="/JavaPlusDoc/basic/12.html" class="sidebar-link">第12天-Number-Math类</a></li><li><a href="/JavaPlusDoc/basic/13.html" class="sidebar-link">第13天-Character</a></li><li><a href="/JavaPlusDoc/basic/14.html" class="sidebar-link">第14天-String</a></li><li><a href="/JavaPlusDoc/basic/15.html" class="sidebar-link">第15天-StringBuffer</a></li><li><a href="/JavaPlusDoc/basic/16.html" class="sidebar-link">第16天-数组</a></li><li><a href="/JavaPlusDoc/basic/17.html" class="sidebar-link">第17天-日期时间</a></li><li><a href="/JavaPlusDoc/basic/18.html" class="sidebar-link">第18天-正则表达式</a></li><li><a href="/JavaPlusDoc/basic/19.html" class="sidebar-link">第19天-方法</a></li><li><a href="/JavaPlusDoc/basic/20.html" class="sidebar-link">第20天-构造方法</a></li><li><a href="/JavaPlusDoc/basic/21.html" class="sidebar-link">第21天-流</a></li><li><a href="/JavaPlusDoc/basic/22.html" class="sidebar-link">第22天-异常处理</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>达达JAVA写法思路</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/basic/23.html" class="sidebar-link">第23天-继承的概念</a></li><li><a href="/JavaPlusDoc/basic/24.html" class="sidebar-link">第24天-重写与重载</a></li><li><a href="/JavaPlusDoc/basic/25.html" class="sidebar-link">第25天-多态</a></li><li><a href="/JavaPlusDoc/basic/26.html" class="sidebar-link">第26天-抽象类</a></li><li><a href="/JavaPlusDoc/basic/27.html" class="sidebar-link">第27天-封装</a></li><li><a href="/JavaPlusDoc/basic/28.html" class="sidebar-link">第28天-接口</a></li><li><a href="/JavaPlusDoc/basic/29.html" class="sidebar-link">第29天-枚举</a></li><li><a href="/JavaPlusDoc/basic/30.html" class="sidebar-link">第30天-反射</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>达达JAVA进阶教程</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/basicUp/31.html" class="sidebar-link">第31天-数据结构</a></li><li><a href="/JavaPlusDoc/basicUp/32.html" class="sidebar-link">第32天-集合框架</a></li><li><a href="/JavaPlusDoc/basicUp/33.html" class="sidebar-link">第33天-ArrayList</a></li><li><a href="/JavaPlusDoc/basicUp/34.html" class="sidebar-link">第34天-LinkedList</a></li><li><a href="/JavaPlusDoc/basicUp/35.html" class="sidebar-link">第35天-HashSet</a></li><li><a href="/JavaPlusDoc/basicUp/36.html" class="sidebar-link">第36天-HashMap</a></li><li><a href="/JavaPlusDoc/basicUp/37.html" class="sidebar-link">第37天-Iterator</a></li><li><a href="/JavaPlusDoc/basicUp/38.html" class="sidebar-link">第38天-Object</a></li><li><a href="/JavaPlusDoc/basicUp/39.html" class="sidebar-link">第39天-NIO</a></li><li><a href="/JavaPlusDoc/basicUp/40.html" class="sidebar-link">第40天-泛型</a></li><li><a href="/JavaPlusDoc/basicUp/41.html" class="sidebar-link">第41天-序列化</a></li><li><a href="/JavaPlusDoc/basicUp/42.html" class="sidebar-link">第42天-网络编程</a></li><li><a href="/JavaPlusDoc/basicUp/43.html" class="sidebar-link">第43天-发送邮件</a></li><li><a href="/JavaPlusDoc/basicUp/44.html" class="sidebar-link">第44天-多线程编程</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>刷题练习平台</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/coding-practice/" class="sidebar-link">题库导航</a></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><a href="/JavaPlusDoc/coding-practice/topics/" class="sidebar-heading clickable"><span>📝 专题练习</span> <span class="arrow right"></span></a> <!----></section></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><a href="/JavaPlusDoc/coding-practice/written-exam/" class="sidebar-heading clickable"><span>📝 笔试真题</span> <span class="arrow right"></span></a> <!----></section></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><a href="/JavaPlusDoc/coding-practice/interview/" class="sidebar-heading clickable"><span>💼 面试真题</span> <span class="arrow right"></span></a> <!----></section></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><a href="/JavaPlusDoc/coding-practice/contest/" class="sidebar-heading clickable"><span>🏆 竞赛题库</span> <span class="arrow right"></span></a> <!----></section></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><a href="/JavaPlusDoc/coding-practice/statistics/" class="sidebar-heading clickable"><span>📊 学习统计</span> <span class="arrow right"></span></a> <!----></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>SQL专属笔记</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/" class="sidebar-link">手册简介</a></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>基础语法</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/basic/syntax.html" class="sidebar-link">SQL基础语法</a></li><li><a href="/JavaPlusDoc/sql/basic/data-types.html" class="sidebar-link">数据类型</a></li><li><a href="/JavaPlusDoc/sql/basic/constraints.html" class="sidebar-link">约束条件</a></li><li><a href="/JavaPlusDoc/sql/basic/ddl.html" class="sidebar-link">DDL数据定义语言</a></li><li><a href="/JavaPlusDoc/sql/basic/dml.html" class="sidebar-link">DML数据操作语言</a></li><li><a href="/JavaPlusDoc/sql/basic/dql.html" class="sidebar-link">DQL数据查询语言</a></li><li><a href="/JavaPlusDoc/sql/basic/dcl.html" class="sidebar-link">DCL数据控制语言</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>查询操作</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/query/select-basic.html" class="sidebar-link">SELECT查询基础</a></li><li><a href="/JavaPlusDoc/sql/query/where.html" class="sidebar-link">WHERE条件查询</a></li><li><a href="/JavaPlusDoc/sql/query/join.html" class="sidebar-link">JOIN表连接</a></li><li><a href="/JavaPlusDoc/sql/query/subquery.html" class="sidebar-link">子查询</a></li><li><a href="/JavaPlusDoc/sql/query/group-by.html" class="sidebar-link">GROUP BY分组</a></li><li><a href="/JavaPlusDoc/sql/query/order-by.html" class="sidebar-link">ORDER BY排序</a></li><li><a href="/JavaPlusDoc/sql/query/pagination.html" class="sidebar-link">分页查询</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>性能优化</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/perfor/indexr.html" class="sidebar-link">性能优化概述</a></li><li><a href="/JavaPlusDoc/sql/perfor/indexes.html" class="sidebar-link">索引原理与应用</a></li><li><a href="/JavaPlusDoc/sql/perfor/query-optimization.html" class="sidebar-link">查询优化</a></li><li><a href="/JavaPlusDoc/sql/perfor/execution-plans.html" class="sidebar-link">执行计划分析</a></li><li><a href="/JavaPlusDoc/sql/perfor/tuning.html" class="sidebar-link">性能调优</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>高级特性</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/advanced/indexr.html" class="sidebar-link">高级特性概述</a></li><li><a href="/JavaPlusDoc/sql/advanced/transactions.html" class="sidebar-link">事务处理</a></li><li><a href="/JavaPlusDoc/sql/advanced/stored-procedures.html" class="sidebar-link">存储过程与函数</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>函数大全</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/functions/aggregate.html" class="sidebar-link">聚合函数</a></li><li><a href="/JavaPlusDoc/sql/functions/string.html" class="sidebar-link">字符串函数</a></li><li><a href="/JavaPlusDoc/sql/functions/numeric.html" class="sidebar-link">数值函数</a></li><li><a href="/JavaPlusDoc/sql/functions/datetime.html" class="sidebar-link">日期时间函数</a></li><li><a href="/JavaPlusDoc/sql/functions/conditional.html" class="sidebar-link">条件函数</a></li><li><a href="/JavaPlusDoc/sql/functions/window.html" class="sidebar-link">窗口函数</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>实战案例</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/examples/ecommerce.html" class="sidebar-link">电商系统实战</a></li><li><a href="/JavaPlusDoc/sql/examples/analytics.html" class="sidebar-link">数据分析实战</a></li><li><a href="/JavaPlusDoc/sql/examples/reports.html" class="sidebar-link">报表查询实战</a></li><li><a href="/JavaPlusDoc/sql/examples/migration.html" class="sidebar-link">数据迁移实战</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>数据库特定</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/sql/databases/mysql.html" class="sidebar-link">MySQL</a></li><li><a href="/JavaPlusDoc/sql/databases/postgresql.html" class="sidebar-link">PostgreSQL</a></li><li><a href="/JavaPlusDoc/sql/databases/sqlserver.html" class="sidebar-link">SQL Server</a></li><li><a href="/JavaPlusDoc/sql/databases/oracle.html" class="sidebar-link">Oracle</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>UniApp小程序开发</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/uniapp/充电宝小程序实现.html" class="sidebar-link">充电宝小程序实现</a></li><li><a href="/JavaPlusDoc/uniapp/充电桩小程序实现.html" class="sidebar-link">充电桩小程序实现</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Python专属笔记</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Python基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/Python/1.html" class="sidebar-link">第1天-Python历史</a></li><li><a href="/JavaPlusDoc/Python/2.html" class="sidebar-link">第2天-安装Python</a></li><li><a href="/JavaPlusDoc/Python/3.html" class="sidebar-link">第3天-第一个程序</a></li><li><a href="/JavaPlusDoc/Python/4.html" class="sidebar-link">第4天-Python基础</a></li><li><a href="/JavaPlusDoc/Python/5.html" class="sidebar-link">第5天-函数</a></li><li><a href="/JavaPlusDoc/Python/6.html" class="sidebar-link">第6天-高级特性</a></li><li><a href="/JavaPlusDoc/Python/7.html" class="sidebar-link">第7天-函数式编程</a></li><li><a href="/JavaPlusDoc/Python/8.html" class="sidebar-link">第8天-模块</a></li><li><a href="/JavaPlusDoc/Python/9.html" class="sidebar-link">第9天-面向对象编程</a></li><li><a href="/JavaPlusDoc/Python/10.html" class="sidebar-link">第10天-高级编程</a></li><li><a href="/JavaPlusDoc/Python/11.html" class="sidebar-link">第11天-错误和调试</a></li><li><a href="/JavaPlusDoc/Python/12.html" class="sidebar-link">第12天-IO编程</a></li><li><a href="/JavaPlusDoc/Python/13.html" class="sidebar-link">第13天-进程和线程</a></li><li><a href="/JavaPlusDoc/Python/14.html" class="sidebar-link">第14天-正则表达式</a></li><li><a href="/JavaPlusDoc/Python/15.html" class="sidebar-link">第15天-常用内建模块</a></li><li><a href="/JavaPlusDoc/Python/16.html" class="sidebar-link">第16天-常用第三方模块</a></li><li><a href="/JavaPlusDoc/Python/17.html" class="sidebar-link">第17天-图形界面</a></li><li><a href="/JavaPlusDoc/Python/18.html" class="sidebar-link">第18天-网络编程</a></li><li><a href="/JavaPlusDoc/Python/19.html" class="sidebar-link">第19天-电子邮件</a></li><li><a href="/JavaPlusDoc/Python/20.html" class="sidebar-link">第20天-访问数据库</a></li><li><a href="/JavaPlusDoc/Python/21.html" class="sidebar-link">第21天-Web开发</a></li><li><a href="/JavaPlusDoc/Python/22.html" class="sidebar-link">第22天-异步IO</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Java核心技术</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>基础篇</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/e/JVM深入解析.html" class="sidebar-link">JVM深入解析</a></li><li><a href="/JavaPlusDoc/e/JDK开发工具详解.html" class="sidebar-link">JDK开发工具详解</a></li><li><a href="/JavaPlusDoc/e/Java实战演示.html" class="sidebar-link">Java实战演示</a></li><li><a href="/JavaPlusDoc/basic-grammar/java-jdk-jre-jvm.html" class="sidebar-link">Java、JDK、JRE、JVM详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/basic-data-type.html" class="sidebar-link">Java基本数据类型</a></li><li><a href="/JavaPlusDoc/basic-grammar/type-cast.html" class="sidebar-link">数据类型转换</a></li><li><a href="/JavaPlusDoc/basic-grammar/int-cache.html" class="sidebar-link">数据类型缓存池</a></li><li><a href="/JavaPlusDoc/basic-grammar/operator.html" class="sidebar-link">运算符</a></li><li><a href="/JavaPlusDoc/basic-grammar/flow-control.html" class="sidebar-link">流程控制</a></li><li><a href="/JavaPlusDoc/basic-grammar/string-source.html" class="sidebar-link">String类详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/constant-pool.html" class="sidebar-link">字符串常量池</a></li><li><a href="/JavaPlusDoc/basic-grammar/builder-buffer.html" class="sidebar-link">StringBuilder和Buffer</a></li><li><a href="/JavaPlusDoc/basic-grammar/equals.html" class="sidebar-link">字符串比较</a></li><li><a href="/JavaPlusDoc/basic-grammar/object-class.html" class="sidebar-link">面向对象基础</a></li><li><a href="/JavaPlusDoc/basic-grammar/package.html" class="sidebar-link">Java包机制</a></li><li><a href="/JavaPlusDoc/basic-grammar/var.html" class="sidebar-link">变量与方法</a></li><li><a href="/JavaPlusDoc/basic-grammar/construct.html" class="sidebar-link">构造方法</a></li><li><a href="/JavaPlusDoc/basic-grammar/abstract.html" class="sidebar-link">抽象类</a></li><li><a href="/JavaPlusDoc/basic-grammar/interface.html" class="sidebar-link">接口和内部类</a></li><li><a href="/JavaPlusDoc/basic-grammar/encapsulation-inheritance-polymorphism.html" class="sidebar-link">封装继承多态</a></li><li><a href="/JavaPlusDoc/basic-grammar/this-super.html" class="sidebar-link">this与super关键字</a></li><li><a href="/JavaPlusDoc/basic-grammar/immutable.html" class="sidebar-link">不可变对象</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>集合框架</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/basic-grammar/gailan.html" class="sidebar-link">集合框架概览</a></li><li><a href="/JavaPlusDoc/basic-grammar/arraylist.html" class="sidebar-link">ArrayList详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/linkedlist.html" class="sidebar-link">LinkedList详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/stack.html" class="sidebar-link">栈Stack详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/hashmap.html" class="sidebar-link">HashMap详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/linkedhashmap.html" class="sidebar-link">LinkedHashMap详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/treemap.html" class="sidebar-link">TreeMap详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/ArrayDeque.html" class="sidebar-link">ArrayDeque详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/PriorityQueue.html" class="sidebar-link">PriorityQueue详解</a></li><li><a href="/JavaPlusDoc/basic-grammar/array-linked-list.html" class="sidebar-link">ArrayList vs LinkedList</a></li><li><a href="/JavaPlusDoc/basic-grammar/generic.html" class="sidebar-link">Java泛型</a></li><li><a href="/JavaPlusDoc/basic-grammar/iterator-iterable.html" class="sidebar-link">Iterator和Iterable</a></li><li><a href="/JavaPlusDoc/basic-grammar/fail-fast.html" class="sidebar-link">foreach循环陷阱</a></li><li><a href="/JavaPlusDoc/basic-grammar/comparable-omparator.html" class="sidebar-link">Comparable和Comparator</a></li><li><a href="/JavaPlusDoc/basic-grammar/WeakHashMap.html" class="sidebar-link">WeakHashMap详解</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>JVM与性能</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/aJava/jvm.html" class="sidebar-link">JVM基础</a></li><li><a href="/JavaPlusDoc/aJava/JVM内存区域.html" class="sidebar-link">JVM内存区域</a></li><li><a href="/JavaPlusDoc/aJava/程序计数器.html" class="sidebar-link">程序计数器</a></li><li><a href="/JavaPlusDoc/aJava/线程.html" class="sidebar-link">线程</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>并发编程</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/thread/thread.html" class="sidebar-link">多线程入门</a></li><li><a href="/JavaPlusDoc/thread/callable-future-futuretask.html" class="sidebar-link">线程执行结果获取</a></li><li><a href="/JavaPlusDoc/thread/thread-state-and-method.html" class="sidebar-link">线程的6种状态</a></li><li><a href="/JavaPlusDoc/thread/threadpool-executor.html" class="sidebar-link">深入浅出Java线程池ThreadPoolExecutor</a></li><li><a href="/JavaPlusDoc/jobPro/synchronized.html" class="sidebar-link">synchronized和lock</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>IO与网络</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/java-up/shangtou.html" class="sidebar-link">JavaIO知识体系</a></li><li><a href="/JavaPlusDoc/java-up/file-path.html" class="sidebar-link">文件流</a></li><li><a href="/JavaPlusDoc/java-up/reader-writer.html" class="sidebar-link">字节流与字符流</a></li><li><a href="/JavaPlusDoc/java-up/char-byte.html" class="sidebar-link">转换流</a></li><li><a href="/JavaPlusDoc/java-up/serialize.html" class="sidebar-link">序列化和反序列化</a></li><li><a href="/JavaPlusDoc/nio/nio.html" class="sidebar-link">NIO基础</a></li><li><a href="/JavaPlusDoc/nio/BIONIOAIO.html" class="sidebar-link">NIO vs BIO vs AIO</a></li><li><a href="/JavaPlusDoc/nio/buffer-channel.html" class="sidebar-link">Buffer和Channel</a></li><li><a href="/JavaPlusDoc/nio/network-connect.html" class="sidebar-link">网络编程实践</a></li><li><a href="/JavaPlusDoc/nio/moxing.html" class="sidebar-link">IO模型</a></li><li><a href="/JavaPlusDoc/jobPro/IO.html" class="sidebar-link">IO多路复用</a></li><li><a href="/JavaPlusDoc/java-up/netty.html" class="sidebar-link">Netty入门</a></li><li><a href="/JavaPlusDoc/nio/socket-communication-basics.html" class="sidebar-link">Socket通信基础</a></li><li><a href="/JavaPlusDoc/nio/tcp-udp-programming.html" class="sidebar-link">TCP与UDP编程</a></li><li><a href="/JavaPlusDoc/nio/network-protocols-deep-dive.html" class="sidebar-link">网络协议深入解析</a></li><li><a href="/JavaPlusDoc/nio/nio-netty-framework.html" class="sidebar-link">NIO与Netty框架</a></li><li><a href="/JavaPlusDoc/nio/socket-programming-practice.html" class="sidebar-link">Socket编程实战案例</a></li><li><a href="/JavaPlusDoc/nio/socket-performance-optimization.html" class="sidebar-link">Socket性能优化与调试</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><a href="/JavaPlusDoc/gaobingfaxitong/1" class="sidebar-heading clickable"><span>高并发系统</span> <!----></a> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/gaobingfaxitong/1.html" class="sidebar-link">它的通用设计方法是什么</a></li><li><a href="/JavaPlusDoc/gaobingfaxitong/2.html" class="sidebar-link">架构分层</a></li><li><a href="/JavaPlusDoc/gaobingfaxitong/3.html" class="sidebar-link">如何提升系统性能</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>物联网架构系列</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/" class="sidebar-link">IoT架构概览</a></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>架构分层设计</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/device-layer.html" class="sidebar-link">设备层架构</a></li><li><a href="/JavaPlusDoc/iot/network-layer.html" class="sidebar-link">网络层架构</a></li><li><a href="/JavaPlusDoc/iot/application-layer.html" class="sidebar-link">应用层架构</a></li><li><a href="/JavaPlusDoc/iot/frontend-layer.html" class="sidebar-link">前端展示层</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>设备接入与管理</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/device-access.html" class="sidebar-link">设备接入层</a></li><li><a href="/JavaPlusDoc/iot/device-management-layer.html" class="sidebar-link">设备管理层</a></li><li><a href="/JavaPlusDoc/iot/device-authentication.html" class="sidebar-link">设备认证</a></li><li><a href="/JavaPlusDoc/iot/device-control.html" class="sidebar-link">设备控制</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>协议适配层</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/protocol-adapter-layer.html" class="sidebar-link">协议适配器</a></li><li><a href="/JavaPlusDoc/iot/mqtt-access-layer.html" class="sidebar-link">MQTT接入</a></li><li><a href="/JavaPlusDoc/iot/http-access-layer.html" class="sidebar-link">HTTP接入</a></li><li><a href="/JavaPlusDoc/iot/coap-access-layer.html" class="sidebar-link">CoAP接入</a></li><li><a href="/JavaPlusDoc/iot/tcp-udp-access-layer.html" class="sidebar-link">TCP/UDP接入</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>数据处理与存储</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/data-processing.html" class="sidebar-link">数据处理层</a></li><li><a href="/JavaPlusDoc/iot/data-reception.html" class="sidebar-link">数据接收</a></li><li><a href="/JavaPlusDoc/iot/redis.html" class="sidebar-link">Redis缓存</a></li><li><a href="/JavaPlusDoc/iot/kafka.html" class="sidebar-link">Kafka消息队列</a></li><li><a href="/JavaPlusDoc/iot/cassandra.html" class="sidebar-link">Cassandra存储</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>实战项目</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/practice-projects.html" class="sidebar-link">实践项目案例</a></li><li><a href="/JavaPlusDoc/iot/geofence.html" class="sidebar-link">电子围栏功能设计</a></li><li><a href="/JavaPlusDoc/iot/charging-station-gateway.html" class="sidebar-link">充电桩设备网关</a></li><li><a href="/JavaPlusDoc/iot/netty-gateway-design.html" class="sidebar-link">百万台设备Netty网关架构</a></li><li><a href="/JavaPlusDoc/iot/netty-gateway-design-mi.html" class="sidebar-link">小米实战过亿设备Netty网关架构</a></li><li><a href="/JavaPlusDoc/iot/netty-gateway-bat.html" class="sidebar-link">哈喽电池设备Netty网关架构</a></li><li><a href="/JavaPlusDoc/iot/user-organization-permissions.html" class="sidebar-link">用户组织权限</a></li><li><a href="/JavaPlusDoc/iot/database-storage.html" class="sidebar-link">架构懂了就来了解数据库存储扩展千亿读写</a></li><li><a href="/JavaPlusDoc/iot/mermaid-test.html" class="sidebar-link">Mermaid图表测试</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>GO语言技术</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/" class="sidebar-link">GO技术手册导航</a></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>基础语法</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/basic-grammar/basic-syntax.html" class="sidebar-link">GO语言基础语法</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>高级特性</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/advanced/concurrency.html" class="sidebar-link">并发编程</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>标准库</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/stdlib/http.html" class="sidebar-link">HTTP编程</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>最佳实践</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/best-practices/testing.html" class="sidebar-link">测试最佳实践</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>实战项目</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/projects/web-service.html" class="sidebar-link">Web服务开发实战</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>分布式架构</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>缓存系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/high-concurrency/why-cache.html" class="sidebar-link">缓存使用场景</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-single-thread-model.html" class="sidebar-link">Redis vs Memcached</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-data-types.html" class="sidebar-link">Redis数据类型</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-expiration-policies-and-lru.html" class="sidebar-link">Redis过期策略</a></li><li><a href="/JavaPlusDoc/high-concurrency/how-to-ensure-high-concurrency-and-high-availability-of-redis.html" class="sidebar-link">Redis高并发与高可用</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-master-slave.html" class="sidebar-link">Redis主从架构</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-persistence.html" class="sidebar-link">Redis持久化</a></li><li><a href="/JavaPlusDoc/high-concurrency/redis-sentinel.html" class="sidebar-link">Redis哨兵集群</a></li><li><a href="/JavaPlusDoc/jobPro/redis.html" class="sidebar-link">Redis应用场景</a></li><li><a href="/JavaPlusDoc/redis/redis-key-expiration.html" class="sidebar-link">Redis key过期问题解决方案</a></li><li><a href="/JavaPlusDoc/java-up/redis-springboot.html" class="sidebar-link">SpringBoot整合Redis</a></li><li><a href="/JavaPlusDoc/redis/xuebeng-chuantou-jichuan.html" class="sidebar-link">缓存雪崩、穿透、击穿</a></li><li><a href="/JavaPlusDoc/redis/redis-lua.html" class="sidebar-link">深入分析Redis Lua脚本运行原理</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>消息队列</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/messagequeue/why-mq.html" class="sidebar-link">为什么使用消息队列</a></li><li><a href="/JavaPlusDoc/messagequeue/how-to-ensure-high-availability-of-message-queues.html" class="sidebar-link">消息队列高可用</a></li><li><a href="/JavaPlusDoc/messagequeue/how-to-ensure-that-messages-are-not-repeatedly-consumed.html" class="sidebar-link">消息不重复消费</a></li><li><a href="/JavaPlusDoc/messagequeue/how-to-ensure-the-reliable-transmission-of-messages.html" class="sidebar-link">消息可靠传输</a></li><li><a href="/JavaPlusDoc/messagequeue/how-to-ensure-the-order-of-messages.html" class="sidebar-link">消息顺序性</a></li><li><a href="/JavaPlusDoc/messagequeue/mq-time-delay-and-expired-failure.html" class="sidebar-link">消息队列延时问题</a></li><li><a href="/JavaPlusDoc/messagequeue/mq-design.html" class="sidebar-link">消息队列设计</a></li><li><a href="/JavaPlusDoc/java-up/rabbitmq.html" class="sidebar-link">RabbitMQ入门</a></li><li><a href="/JavaPlusDoc/power/kafka.html" class="sidebar-link">Kafka基础</a></li><li><a href="/JavaPlusDoc/power/kafkas.html" class="sidebar-link">Kafka集群</a></li><li><a href="/JavaPlusDoc/power/comsumer.html" class="sidebar-link">Kafka消费者</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>搜索引擎</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/searchEngine/es-architecture.html" class="sidebar-link">ES分布式架构原理</a></li><li><a href="/JavaPlusDoc/searchEngine/es-write-query-search.html" class="sidebar-link">ES写入数据原理</a></li><li><a href="/JavaPlusDoc/searchEngine/es-optimizing-query-performance.html" class="sidebar-link">ES查询效率优化</a></li><li><a href="/JavaPlusDoc/searchEngine/es-production-cluster.html" class="sidebar-link">ES生产集群部署</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>微服务架构</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/worker/3.html" class="sidebar-link">微服务优雅上下线</a></li><li><a href="/JavaPlusDoc/worker/1.html" class="sidebar-link">滚动部署</a></li><li><a href="/JavaPlusDoc/worker/2.html" class="sidebar-link">Nacos优雅停机</a></li><li><a href="/JavaPlusDoc/dubbo/dubbo.html" class="sidebar-link">Dubbo基础</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>数据库技术</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/mysql/mysql.html" class="sidebar-link">SQL执行过程</a></li><li><a href="/JavaPlusDoc/mysql/shiwu-shixia.html" class="sidebar-link">MySQL事务实现</a></li><li><a href="/JavaPlusDoc/mysql/lijie-shiwu.html" class="sidebar-link">深入理解MySQL事务</a></li><li><a href="/JavaPlusDoc/mysql/mysql-locks.html" class="sidebar-link">MySQL锁机制详解</a></li><li><a href="/JavaPlusDoc/mysql/redis-shuju-yizhixing.html" class="sidebar-link">MySQL和Redis数据一致性</a></li><li><a href="/JavaPlusDoc/jobPro/InnoDB.html" class="sidebar-link">MyISAM vs InnoDB</a></li><li><a href="/JavaPlusDoc/java-up/mongodb.html" class="sidebar-link">MongoDB基础</a></li><li><a href="/JavaPlusDoc/java-up/mongodb-backup-restore.html" class="sidebar-link">MongoDB备份与恢复</a></li><li><a href="/JavaPlusDoc/MyBatis-Plus/getting-started.html" class="sidebar-link">MyBatis-Plus入门</a></li><li><a href="/JavaPlusDoc/MyBatis-Plus/service-interface.html" class="sidebar-link">MyBatis-Plus接口</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>运维与部署</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Docker容器技术</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/docker/docker-tutorial.html" class="sidebar-link">Docker教程</a></li><li><a href="/JavaPlusDoc/docker/docker架构.html" class="sidebar-link">docker架构</a></li><li><a href="/JavaPlusDoc/docker/docker-install.html" class="sidebar-link">Docker安装指南</a></li><li><a href="/JavaPlusDoc/docker/docker-mirror.html" class="sidebar-link">Docker配置国内源</a></li><li><a href="/JavaPlusDoc/docker/docker-images.html" class="sidebar-link">Docker镜像管理</a></li><li><a href="/JavaPlusDoc/docker/docker-containers.html" class="sidebar-link">Docker容器管理</a></li><li><a href="/JavaPlusDoc/docker/docker-network.html" class="sidebar-link">Docker网络配置</a></li><li><a href="/JavaPlusDoc/docker/docker-volumes.html" class="sidebar-link">Docker数据卷管理</a></li><li><a href="/JavaPlusDoc/docker/docker-dockerfile.html" class="sidebar-link">Dockerfile最佳实践</a></li><li><a href="/JavaPlusDoc/docker/docker-compose.html" class="sidebar-link">Docker Compose详解</a></li><li><a href="/JavaPlusDoc/docker/docker-swarm.html" class="sidebar-link">Docker Swarm集群</a></li><li><a href="/JavaPlusDoc/docker/docker-security.html" class="sidebar-link">Docker安全最佳实践</a></li><li><a href="/JavaPlusDoc/docker/docker-production.html" class="sidebar-link">Docker生产环境部署</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>基础设施</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/aJava/设备网关后端设计.html" class="sidebar-link">设备网关后端设计</a></li><li><a href="/JavaPlusDoc/aJava/Redis底层数据结构原理.html" class="sidebar-link">Redis底层数据结构原理</a></li><li><a href="/JavaPlusDoc/aJava/HashMap底层原理.html" class="sidebar-link">HashMap底层原理</a></li><li><a href="/JavaPlusDoc/aJava/MySQL的InnoDB原理.html" class="sidebar-link">MySQL的InnoDB原理</a></li><li><a href="/JavaPlusDoc/aJava/充电桩业务实现.html" class="sidebar-link">充电桩业务实现</a></li><li><a href="/JavaPlusDoc/aJava/充电宝业务实现.html" class="sidebar-link">充电宝业务实现</a></li><li><a href="/JavaPlusDoc/aJava/数据库分片技术实现.html" class="sidebar-link">数据库分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/Redis分片技术实现.html" class="sidebar-link">Redis分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/MongoDB分片技术实现.html" class="sidebar-link">MongoDB分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/Elasticsearch分片技术实现.html" class="sidebar-link">Elasticsearch分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/HBase分片技术实现.html" class="sidebar-link">HBase分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/ClickHouse分片技术实现.html" class="sidebar-link">ClickHouse分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/PostgreSQL分片技术实现.html" class="sidebar-link">PostgreSQL分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/Oracle分片技术实现.html" class="sidebar-link">Oracle分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/SQLServer分片技术实现.html" class="sidebar-link">SQLServer分片技术实现</a></li><li><a href="/JavaPlusDoc/aJava/云计算是什么.html" class="sidebar-link">云计算基础</a></li><li><a href="/JavaPlusDoc/aJava/mysql是什么.html" class="sidebar-link">mysql是什么</a></li><li><a href="/JavaPlusDoc/aJava/mogodb是什么.html" class="sidebar-link">mogodb是什么</a></li><li><a href="/JavaPlusDoc/aJava/安全组是什么.html" class="sidebar-link">安全组是什么</a></li><li><a href="/JavaPlusDoc/aJava/子网掩码是什么.html" class="sidebar-link">子网掩码是什么</a></li><li><a href="/JavaPlusDoc/aJava/路由器是什么.html" class="sidebar-link">路由器是什么</a></li><li><a href="/JavaPlusDoc/aJava/交换机是什么.html" class="sidebar-link">交换机是什么</a></li><li><a href="/JavaPlusDoc/aJava/CDN是什么.html" class="sidebar-link">CDN是什么</a></li><li><a href="/JavaPlusDoc/aJava/nginx是什么.html" class="sidebar-link">nginx是什么</a></li><li><a href="/JavaPlusDoc/aJava/tomcat是什么.html" class="sidebar-link">tomcat是什么</a></li><li><a href="/JavaPlusDoc/aJava/Eureka是什么.html" class="sidebar-link">Eureka是什么</a></li><li><a href="/JavaPlusDoc/aJava/nacos是什么.html" class="sidebar-link">nacos是什么</a></li><li><a href="/JavaPlusDoc/aJava/Zookeeper是什么.html" class="sidebar-link">Zookeeper是什么</a></li><li><a href="/JavaPlusDoc/aJava/ElasticSearch是什么.html" class="sidebar-link">ElasticSearch是什么</a></li><li><a href="/JavaPlusDoc/aJava/微服务是什么.html" class="sidebar-link">微服务基础</a></li><li><a href="/JavaPlusDoc/aJava/HDFS是什么.html" class="sidebar-link">HDFS基础</a></li><li><a href="/JavaPlusDoc/aJava/块存储是什么.html" class="sidebar-link">块存储</a></li><li><a href="/JavaPlusDoc/aJava/对象存储是什么.html" class="sidebar-link">对象存储</a></li><li><a href="/JavaPlusDoc/aJava/存储快照是什么.html" class="sidebar-link">存储快照</a></li><li><a href="/JavaPlusDoc/aJava/负载均衡是什么.html" class="sidebar-link">负载均衡</a></li><li><a href="/JavaPlusDoc/aJava/什么是灰度发布.html" class="sidebar-link">灰度发布</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>DevOps工具链</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/aJava/Jenkins是什么.html" class="sidebar-link">Jenkins基础</a></li><li><a href="/JavaPlusDoc/aJava/Ansible是什么.html" class="sidebar-link">Ansible基础</a></li><li><a href="/JavaPlusDoc/aJava/DevOps是什么.html" class="sidebar-link">DevOps概念</a></li><li><a href="/JavaPlusDoc/aJava/WAF和DDOS的区别是什么.html" class="sidebar-link">WAF和DDOS防护</a></li><li><a href="/JavaPlusDoc/linux/linux.html" class="sidebar-link">Linux常用命令</a></li><li><a href="/JavaPlusDoc/linux/nginx-env.html" class="sidebar-link">Nginx环境配置</a></li><li><a href="/JavaPlusDoc/linux/kibana-install.html" class="sidebar-link">Kibana安装与使用</a></li><li><a href="/JavaPlusDoc/java-up/nginx.html" class="sidebar-link">Nginx入门</a></li><li><a href="/JavaPlusDoc/java-up/ssl.html" class="sidebar-link">Nginx SSL配置</a></li><li><a href="/JavaPlusDoc/worker/nginx-optimization.html" class="sidebar-link">Nginx优化与防盗链</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>部署与监控</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/worker/elk.html" class="sidebar-link">ELK日志系统</a></li><li><a href="/JavaPlusDoc/worker/elfk-cluster.html" class="sidebar-link">ELFK生产集群搭建</a></li><li><a href="/JavaPlusDoc/worker/jenkins.html" class="sidebar-link">Jenkins部署SpringBoot</a></li><li><a href="/JavaPlusDoc/worker/rocketmq.html" class="sidebar-link">RocketMQ安装</a></li><li><a href="/JavaPlusDoc/worker/grafana.html" class="sidebar-link">Grafana监控</a></li><li><a href="/JavaPlusDoc/worker/prometheus.html" class="sidebar-link">Prometheus单机部署</a></li><li><a href="/JavaPlusDoc/worker/grafana-database-monitoring.html" class="sidebar-link">Grafana监控MySQL、Redis和MongoDB</a></li><li><a href="/JavaPlusDoc/worker/k8s-monitoring.html" class="sidebar-link">K8s监控</a></li><li><a href="/JavaPlusDoc/worker/cpu-troubleshooting.html" class="sidebar-link">CPU使用率100%异常排查</a></li><li><a href="/JavaPlusDoc/worker/springboot.html" class="sidebar-link">SpringBoot启动脚本</a></li><li><a href="/JavaPlusDoc/worker/skywalking.html" class="sidebar-link">SkyWalking监控</a></li><li><a href="/JavaPlusDoc/worker/7.html" class="sidebar-link">前端自动化部署</a></li><li><a href="/JavaPlusDoc/sre/sre.html" class="sidebar-link">SRE实践</a></li><li><a href="/JavaPlusDoc/sre/monitor.html" class="sidebar-link">分布式监控</a></li><li><a href="/JavaPlusDoc/sre/serviceQuality.html" class="sidebar-link">服务质量目标</a></li><li><a href="/JavaPlusDoc/sre/errorBudget.html" class="sidebar-link">错误预算</a></li><li><a href="/JavaPlusDoc/sre/system.html" class="sidebar-link">系统性能指标</a></li><li><a href="/JavaPlusDoc/sre/server-mining-virus-removal.html" class="sidebar-link">服务器挖矿病毒清除</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>ElasticSearch</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/es/es-architecture.html" class="sidebar-link">ElasticSearch架构</a></li><li><a href="/JavaPlusDoc/es/es-optimizing-query-performance.html" class="sidebar-link">查询性能优化</a></li><li><a href="/JavaPlusDoc/es/es-cluster-setup.html" class="sidebar-link">Linux搭建ES集群与Kibana</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>产品系列</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/products/" class="sidebar-link">产品概述</a></li><li><a href="/JavaPlusDoc/products/product-gallery.html" class="sidebar-link">【溜溜梅】官方商城小程序</a></li><li><a href="/JavaPlusDoc/products/productChange.html" class="sidebar-link">小区充电桩小程序</a></li><li><a href="/JavaPlusDoc/products/photoImage.html" class="sidebar-link">话圈小程序</a></li><li><a href="/JavaPlusDoc/products/changeChange.html" class="sidebar-link">速绿充电小程序体验设计</a></li><li><a href="/JavaPlusDoc/products/changeChange2.html" class="sidebar-link">恒想充充电桩小程序改版设计</a></li><li><a href="/JavaPlusDoc/products/productShare.html" class="sidebar-link">分销小程序</a></li><li><a href="/JavaPlusDoc/products/product-car.html" class="sidebar-link">电动车充电桩小程序</a></li><li><a href="/JavaPlusDoc/products/无人岛商业计划书.html" class="sidebar-link">无人岛商业计划书</a></li><li><a href="/JavaPlusDoc/products/蜗牛睡眠高嵩.html" class="sidebar-link">蜗牛睡眠高嵩</a></li><li><a href="/JavaPlusDoc/products/优质行业报告网站.html" class="sidebar-link">优质行业报告网站</a></li><li><a href="/JavaPlusDoc/products/篮球场如何赚钱.html" class="sidebar-link">篮球场如何赚钱</a></li><li><a href="/JavaPlusDoc/products/enterprise-platform.html" class="sidebar-link">企业级应用平台</a></li><li><a href="/JavaPlusDoc/products/microservice-framework.html" class="sidebar-link">微服务框架</a></li><li><a href="/JavaPlusDoc/products/data-analytics-suite.html" class="sidebar-link">数据分析套件</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>实战案例</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Web应用开发</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/jobPro/login.html" class="sidebar-link">用户注册登录系统</a></li><li><a href="/JavaPlusDoc/jobPro/lan.html" class="sidebar-link">多语言国际化</a></li><li><a href="/JavaPlusDoc/jobPro/jobPro.html" class="sidebar-link">PC网站微信扫码登录</a></li><li><a href="/JavaPlusDoc/jobPro/wechat-miniprogram-guide.html" class="sidebar-link">微信小程序开发完全指南</a></li><li><a href="/JavaPlusDoc/jobPro/wechat-customer-service.html" class="sidebar-link">微信小程序API客服消息</a></li><li><a href="/JavaPlusDoc/jobPro/wechat-open-api.html" class="sidebar-link">微信小程序开放接口</a></li><li><a href="/JavaPlusDoc/jobPro/wechat-operation-center.html" class="sidebar-link">微信小程序运维中心</a></li><li><a href="/JavaPlusDoc/jobPro/appMsg.html" class="sidebar-link">微信小程序消息推送</a></li><li><a href="/JavaPlusDoc/jobPro/miniprogram.html" class="sidebar-link">微信小程序自动化部署</a></li><li><a href="/JavaPlusDoc/jobPro/appPay.html" class="sidebar-link">微信小程序支付功能</a></li><li><a href="/JavaPlusDoc/jobPro/uniapp.html" class="sidebar-link">iOS/Android打包发布</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>GO语言应用</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/go/projects/web-service.html" class="sidebar-link">GO Web服务开发实战</a></li><li><a href="/JavaPlusDoc/go/advanced/concurrency.html" class="sidebar-link">GO并发编程实践</a></li><li><a href="/JavaPlusDoc/go/stdlib/http.html" class="sidebar-link">GO HTTP编程指南</a></li><li><a href="/JavaPlusDoc/go/best-practices/testing.html" class="sidebar-link">GO测试最佳实践</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>技术架构</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/tech/high-availability-group-buying.html" class="sidebar-link">500万日订单下的高可用拼购系统</a></li><li><a href="/JavaPlusDoc/tech/twenty-million-orders-architecture.html" class="sidebar-link">2000万日订单背后的技术架构</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>企业级应用</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/java-up/aop-log.html" class="sidebar-link">SpringAOP实践</a></li><li><a href="/JavaPlusDoc/java-up/ioc.html" class="sidebar-link">SpringIoC实践</a></li><li><a href="/JavaPlusDoc/java-up/transaction.html" class="sidebar-link">事务支持</a></li><li><a href="/JavaPlusDoc/java-up/Filter-Interceptor-Listener.html" class="sidebar-link">过滤器与拦截器</a></li><li><a href="/JavaPlusDoc/java-up/quartz.html" class="sidebar-link">SpringBoot整合Quartz</a></li><li><a href="/JavaPlusDoc/java-up/mybatis.html" class="sidebar-link">SpringBoot整合MyBatis</a></li><li><a href="/JavaPlusDoc/java-up/validator.html" class="sidebar-link">数据校验</a></li><li><a href="/JavaPlusDoc/worker/6.html" class="sidebar-link">API数据加密</a></li><li><a href="/JavaPlusDoc/data/data.html" class="sidebar-link">大数据开发实践</a></li><li><a href="/JavaPlusDoc/order/order-BizOrderService.html" class="sidebar-link">订单流程设计</a></li><li><a href="/JavaPlusDoc/linuxPrometheus/linux.html" class="sidebar-link">数据导入导出优化</a></li></ul></section></li><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading"><span>物联网应用</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/iot.html" class="sidebar-link">物联网基础</a></li><li><a href="/JavaPlusDoc/iot/kafka.html" class="sidebar-link">物联网Kafka应用</a></li><li><a href="/JavaPlusDoc/iot/redis.html" class="sidebar-link">物联网Redis应用</a></li><li><a href="/JavaPlusDoc/iot/cassandra.html" class="sidebar-link">物联网Cassandra应用</a></li><li><a href="/JavaPlusDoc/iot/server.html" class="sidebar-link">物联网设备管理</a></li><li><a href="/JavaPlusDoc/iot/byteArray.html" class="sidebar-link">字节数组处理</a></li><li><a href="/JavaPlusDoc/iot/iotJob.html" class="sidebar-link">物联网业务流程</a></li><li><a href="/JavaPlusDoc/iot/protocol-adapter-layer.html" class="sidebar-link">协议适配层</a></li><li><a href="/JavaPlusDoc/iot/device-management-layer.html" class="sidebar-link">设备管理层</a></li><li><a href="/JavaPlusDoc/iot/application-service-layer.html" class="sidebar-link">应用服务层</a></li></ul></section></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Java线程</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/thread/java-multithreading-basics.html" class="sidebar-link">Java多线程基础</a></li><li><a href="/JavaPlusDoc/thread/java-thread-synchronization.html" class="sidebar-link">Java线程同步机制</a></li><li><a href="/JavaPlusDoc/thread/java-concurrent-utilities.html" class="sidebar-link">Java并发工具类</a></li><li><a href="/JavaPlusDoc/thread/java-threadpool-advanced.html" class="sidebar-link">Java线程池深入解析</a></li><li><a href="/JavaPlusDoc/thread/java-memory-model.html" aria-current="page" class="active sidebar-link">Java内存模型与并发编程</a></li><li><a href="/JavaPlusDoc/thread/java-concurrency-best-practices.html" class="sidebar-link">Java并发编程最佳实践</a></li><li><a href="/JavaPlusDoc/thread/thread-state-and-method.html" class="sidebar-link">线程状态与方法</a></li><li><a href="/JavaPlusDoc/thread/callable-future-futuretask.html" class="sidebar-link">Callable、Future、FutureTask</a></li><li><a href="/JavaPlusDoc/thread/threadpool-executor.html" class="sidebar-link">ThreadPoolExecutor详解</a></li><li><a href="/JavaPlusDoc/aThread/linux.html" class="sidebar-link">linux线程基础</a></li><li><a href="/JavaPlusDoc/aThread/jvm.html" class="sidebar-link">jvm基础知识</a></li><li><a href="/JavaPlusDoc/aThread/jvmThread.html" class="sidebar-link">jvm线程</a></li><li><a href="/JavaPlusDoc/aThread/jvmThreadEvent.html" class="sidebar-link">jvm线程通信原理</a></li><li><a href="/JavaPlusDoc/aThread/jvmThreadSync.html" class="sidebar-link">jvm线程同步机制</a></li><li><a href="/JavaPlusDoc/aThread/jvmLock.html" class="sidebar-link">java锁实现原理</a></li><li><a href="/JavaPlusDoc/aThread/jvmAtomic.html" class="sidebar-link">java原子操作类实现原理</a></li><li><a href="/JavaPlusDoc/aThread/jvmConcurrent.html" class="sidebar-link">java并发容器实现原理</a></li><li><a href="/JavaPlusDoc/aThread/javaThreadPool.html" class="sidebar-link">java线程池实现原理</a></li><li><a href="/JavaPlusDoc/aThread/javaThreadPoolUse.html" class="sidebar-link">java线程池使用</a></li><li><a href="/JavaPlusDoc/aThread/javaThreadSkill.html" class="sidebar-link">java多线程编程技巧</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>电商业务交易系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/ecommerce/product-management.html" class="sidebar-link">商品管理系统</a></li><li><a href="/JavaPlusDoc/ecommerce/order-management.html" class="sidebar-link">订单管理系统</a></li><li><a href="/JavaPlusDoc/ecommerce/payment-system.html" class="sidebar-link">支付系统设计</a></li><li><a href="/JavaPlusDoc/ecommerce/shopping-cart.html" class="sidebar-link">购物车系统</a></li><li><a href="/JavaPlusDoc/ecommerce/inventory-management.html" class="sidebar-link">库存管理系统</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>跨境电商系统架构</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/ecommerce/cross-border/" class="sidebar-link">系统架构概述</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/product-catalog-service.html" class="sidebar-link">商品管理系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/pricing-engine.html" class="sidebar-link">价格计算引擎</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/order-processing-system.html" class="sidebar-link">订单处理系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/payment-gateway-system.html" class="sidebar-link">支付网关系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/logistics-delivery-system.html" class="sidebar-link">物流配送系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/after-sales-service.html" class="sidebar-link">售后服务系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/user-management-system.html" class="sidebar-link">用户管理与权限系统</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/search-recommendation-engine.html" class="sidebar-link">搜索推荐引擎</a></li><li><a href="/JavaPlusDoc/ecommerce/cross-border/shopping-cart-system.html" class="sidebar-link">购物车系统</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>营销系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/marketing/coupon-system.html" class="sidebar-link">优惠券系统</a></li><li><a href="/JavaPlusDoc/marketing/flash-sale-system.html" class="sidebar-link">秒杀系统</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>物联网设备接入系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/iot/device-access.html" class="sidebar-link">设备接入系统</a></li><li><a href="/JavaPlusDoc/iot/device-management.html" class="sidebar-link">设备管理服务</a></li><li><a href="/JavaPlusDoc/iot/device-authentication.html" class="sidebar-link">设备认证服务</a></li><li><a href="/JavaPlusDoc/iot/data-reception.html" class="sidebar-link">数据接收服务</a></li><li><a href="/JavaPlusDoc/iot/device-control.html" class="sidebar-link">设备控制服务</a></li><li><a href="/JavaPlusDoc/iot/protocol-adapter.html" class="sidebar-link">协议适配器</a></li><li><a href="/JavaPlusDoc/iot/mqtt-access-layer.html" class="sidebar-link">MQTT设备接入层</a></li><li><a href="/JavaPlusDoc/iot/coap-access-layer.html" class="sidebar-link">CoAP设备接入层</a></li><li><a href="/JavaPlusDoc/iot/http-access-layer.html" class="sidebar-link">HTTP设备接入层</a></li><li><a href="/JavaPlusDoc/iot/tcp-udp-access-layer.html" class="sidebar-link">TCP/UDP设备接入层</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>计算机基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/JavaPlusDoc/cs/os.html" class="sidebar-link">操作系统</a></li><li><a href="/JavaPlusDoc/cs/wangluo.html" class="sidebar-link">计算机网络</a></li><li><a href="/JavaPlusDoc/cs/tcp-ip.html" class="sidebar-link">TCP/IP协议详解</a></li><li><a href="/JavaPlusDoc/aJava/cookie-session-token.html" class="sidebar-link">Cookie/Session/Token</a></li></ul></section></li></ul> </aside> <div class="password-shadow password-wrapper-in" style="display:none;" data-v-59e6cb88 data-v-7dd95ae2><h3 class="title" data-v-59e6cb88></h3> <!----> <label id="box" class="inputBox" data-v-59e6cb88><input type="password" value="" data-v-59e6cb88> <span data-v-59e6cb88>Konck! Knock!</span> <button data-v-59e6cb88>OK</button></label> <div class="footer" data-v-59e6cb88><span data-v-59e6cb88><i class="iconfont reco-theme" data-v-59e6cb88></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-59e6cb88>vuePress-theme-reco</a></span> <span data-v-59e6cb88><i class="iconfont reco-copyright" data-v-59e6cb88></i> <a data-v-59e6cb88><!---->
<!---->
2025
</a></span></div></div> <div data-v-7dd95ae2><div data-v-7dd95ae2><main class="page"><section style="display:;"><div class="page-title"><h1 class="title">Java内存模型与并发编程</h1> <div data-v-8a445198><!----> <!----> <!----> <!----></div></div> <div class="theme-reco-content content__default"><h1 id="java内存模型与并发编程"><a href="#java内存模型与并发编程" class="header-anchor">#</a> Java内存模型与并发编程</h1> <h2 id="_1-java内存模型概述"><a href="#_1-java内存模型概述" class="header-anchor">#</a> 1. Java内存模型概述</h2> <h3 id="_1-1-什么是java内存模型"><a href="#_1-1-什么是java内存模型" class="header-anchor">#</a> 1.1 什么是Java内存模型</h3> <p>Java内存模型(Java Memory Model,JMM)是Java虚拟机规范中定义的一个抽象概念,它描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。</p> <h3 id="_1-2-主内存与工作内存"><a href="#_1-2-主内存与工作内存" class="header-anchor">#</a> 1.2 主内存与工作内存</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MemoryModelDemo</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> sharedVariable <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">boolean</span> flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">demonstrateMemoryModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 线程1:写入数据</span>
<span class="token class-name">Thread</span> writer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Writer: 开始写入数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
sharedVariable <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span>
flag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Writer: 数据写入完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Writer-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 线程2:读取数据</span>
<span class="token class-name">Thread</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Reader: 开始读取数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>flag<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 等待flag变为true</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token keyword">yield</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Reader: 读取到的值 = "</span> <span class="token operator">+</span> sharedVariable<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Reader-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
reader<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 确保reader先启动</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
writer<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
writer<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
reader<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">demonstrateMemoryModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_2-内存间交互操作"><a href="#_2-内存间交互操作" class="header-anchor">#</a> 2. 内存间交互操作</h2> <h3 id="_2-1-八种基本操作"><a href="#_2-1-八种基本操作" class="header-anchor">#</a> 2.1 八种基本操作</h3> <p>Java内存模型定义了8种操作来完成主内存与工作内存之间的交互:</p> <ol><li><strong>lock(锁定)</strong>:作用于主内存的变量</li> <li><strong>unlock(解锁)</strong>:作用于主内存的变量</li> <li><strong>read(读取)</strong>:作用于主内存的变量</li> <li><strong>load(载入)</strong>:作用于工作内存的变量</li> <li><strong>use(使用)</strong>:作用于工作内存的变量</li> <li><strong>assign(赋值)</strong>:作用于工作内存的变量</li> <li><strong>store(存储)</strong>:作用于工作内存的变量</li> <li><strong>write(写入)</strong>:作用于主内存的变量</li></ol> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MemoryOperationsDemo</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">int</span> volatileVar <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> normalVar <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">demonstrateMemoryOperations</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span> thread1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 对volatile变量的操作会立即同步到主内存</span>
volatileVar <span class="token operator">=</span> i<span class="token punctuation">;</span>
normalVar <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Thread1: volatileVar = "</span> <span class="token operator">+</span> volatileVar <span class="token operator">+</span>
<span class="token string">", normalVar = "</span> <span class="token operator">+</span> normalVar<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> thread2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> lastVolatileValue <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> lastNormalValue <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> currentVolatile <span class="token operator">=</span> volatileVar<span class="token punctuation">;</span>
<span class="token keyword">int</span> currentNormal <span class="token operator">=</span> normalVar<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>currentVolatile <span class="token operator">!=</span> lastVolatileValue <span class="token operator">||</span>
currentNormal <span class="token operator">!=</span> lastNormalValue<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Thread2: 读取到 volatileVar = "</span> <span class="token operator">+</span> currentVolatile <span class="token operator">+</span>
<span class="token string">", normalVar = "</span> <span class="token operator">+</span> currentNormal<span class="token punctuation">)</span><span class="token punctuation">;</span>
lastVolatileValue <span class="token operator">=</span> currentVolatile<span class="token punctuation">;</span>
lastNormalValue <span class="token operator">=</span> currentNormal<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread1<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread1<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread2<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">demonstrateMemoryOperations</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_3-volatile关键字"><a href="#_3-volatile关键字" class="header-anchor">#</a> 3. volatile关键字</h2> <h3 id="_3-1-volatile的特性"><a href="#_3-1-volatile的特性" class="header-anchor">#</a> 3.1 volatile的特性</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">VolatileDemo</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">boolean</span> stopFlag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">boolean</span> normalFlag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token comment">// 演示volatile的可见性</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">demonstrateVisibility</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=== 演示volatile可见性 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 使用volatile变量的线程</span>
<span class="token class-name">Thread</span> volatileThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>stopFlag<span class="token punctuation">)</span> <span class="token punctuation">{</span>
count<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>count <span class="token operator">%</span> <span class="token number">100000000</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Volatile线程运行中... count = "</span> <span class="token operator">+</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Volatile线程结束,count = "</span> <span class="token operator">+</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Volatile-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 使用普通变量的线程</span>
<span class="token class-name">Thread</span> normalThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>normalFlag<span class="token punctuation">)</span> <span class="token punctuation">{</span>
count<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>count <span class="token operator">%</span> <span class="token number">100000000</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Normal线程运行中... count = "</span> <span class="token operator">+</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Normal线程结束,count = "</span> <span class="token operator">+</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Normal-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
volatileThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
normalThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"主线程:设置停止标志"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
stopFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
normalFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token comment">// 等待线程结束</span>
volatileThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>normalThread<span class="token punctuation">.</span><span class="token function">isAlive</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Normal线程可能因为可见性问题未能及时停止"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
normalThread<span class="token punctuation">.</span><span class="token function">interrupt</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
normalThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 演示volatile禁止指令重排序</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">boolean</span> initialized <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> value <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">demonstrateOrdering</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 演示volatile禁止重排序 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> initThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"初始化线程:开始初始化"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
value <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span> <span class="token comment">// 1. 设置值</span>
initialized <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// 2. 设置初始化标志(volatile写)</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"初始化线程:初始化完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Init-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> useThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"使用线程:等待初始化完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>initialized<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// volatile读</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token keyword">yield</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 由于volatile的happens-before规则,这里一定能看到value=42</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"使用线程:读取到value = "</span> <span class="token operator">+</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"Use-Thread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
useThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
initThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
initThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
useThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">demonstrateVisibility</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">demonstrateOrdering</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_3-2-volatile的使用场景"><a href="#_3-2-volatile的使用场景" class="header-anchor">#</a> 3.2 volatile的使用场景</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>atomic<span class="token punctuation">.</span></span><span class="token class-name">AtomicInteger</span></span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">VolatileUseCases</span> <span class="token punctuation">{</span>
<span class="token comment">// 场景1:状态标志</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">boolean</span> shutdown <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">statusFlagExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=== 状态标志示例 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> worker <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>shutdown<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 执行工作</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"工作线程正在运行..."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"工作线程已停止"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
worker<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"主线程:发送停止信号"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
shutdown <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
worker<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 场景2:一次性安全发布</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token class-name">Resource</span> resource<span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">Resource</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">String</span> data<span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token class-name">Resource</span><span class="token punctuation">(</span><span class="token class-name">String</span> data<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>data <span class="token operator">=</span> data<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getData</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> data<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">safePublicationExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 安全发布示例 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> publisher <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"发布者:创建资源"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Resource</span> newResource <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Resource</span><span class="token punctuation">(</span><span class="token string">"重要数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
resource <span class="token operator">=</span> newResource<span class="token punctuation">;</span> <span class="token comment">// volatile写,确保安全发布</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"发布者:资源发布完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> consumer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消费者:等待资源"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>resource <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token keyword">yield</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消费者:获取到资源 - "</span> <span class="token operator">+</span> resource<span class="token punctuation">.</span><span class="token function">getData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
consumer<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
publisher<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
publisher<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
consumer<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 场景3:独立观察(注意:volatile不保证原子性)</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">int</span> counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">AtomicInteger</span> atomicCounter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AtomicInteger</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">atomicityExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 原子性示例(volatile vs atomic) ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> threadCount <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> incrementsPerThread <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span> threads <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">[</span>threadCount<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token comment">// 使用volatile变量(不保证原子性)</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> threadCount<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
threads<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> incrementsPerThread<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
counter<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// 非原子操作</span>
atomicCounter<span class="token punctuation">.</span><span class="token function">incrementAndGet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 原子操作</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span> thread <span class="token operator">:</span> threads<span class="token punctuation">)</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span> thread <span class="token operator">:</span> threads<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> expected <span class="token operator">=</span> threadCount <span class="token operator">*</span> incrementsPerThread<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"期望值: "</span> <span class="token operator">+</span> expected<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"volatile counter: "</span> <span class="token operator">+</span> counter <span class="token operator">+</span>
<span class="token string">" (可能小于期望值,因为++不是原子操作)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"atomic counter: "</span> <span class="token operator">+</span> atomicCounter<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span>
<span class="token string">" (应该等于期望值)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">statusFlagExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">safePublicationExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">atomicityExample</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_4-happens-before规则"><a href="#_4-happens-before规则" class="header-anchor">#</a> 4. happens-before规则</h2> <h3 id="_4-1-happens-before关系"><a href="#_4-1-happens-before关系" class="header-anchor">#</a> 4.1 happens-before关系</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span>locks<span class="token punctuation">.</span></span><span class="token class-name">ReentrantLock</span></span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HappensBeforeDemo</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> y <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">boolean</span> flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">ReentrantLock</span> lock <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReentrantLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 规则1:程序次序规则</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">programOrderRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=== 程序次序规则 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> thread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
x <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// 操作A</span>
y <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">// 操作B</span>
<span class="token comment">// 根据程序次序规则,A happens-before B</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"x = "</span> <span class="token operator">+</span> x <span class="token operator">+</span> <span class="token string">", y = "</span> <span class="token operator">+</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 规则2:volatile变量规则</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">volatileVariableRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== volatile变量规则 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> writer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
x <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span>
flag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// volatile写</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Writer: 设置x=42, flag=true"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>flag<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// volatile读</span>
<span class="token comment">// 由于volatile规则,writer中的x=42 happens-before 这里的读取</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Reader: flag为true,x = "</span> <span class="token operator">+</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
writer<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
reader<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
writer<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
reader<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 规则3:锁规则</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">lockRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 锁规则 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> thread1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
x <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Thread1: 在锁内设置x=100"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>
lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 解锁操作</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> thread2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 加锁操作</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token comment">// 由于锁规则,thread1的解锁 happens-before thread2的加锁</span>
<span class="token comment">// 因此thread2能看到thread1对x的修改</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Thread2: 在锁内读取x = "</span> <span class="token operator">+</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>
lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread1<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread1<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
thread2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread2<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 规则4:线程启动规则</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">threadStartRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 线程启动规则 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
x <span class="token operator">=</span> <span class="token number">200</span><span class="token punctuation">;</span> <span class="token comment">// 主线程中的操作</span>
<span class="token class-name">Thread</span> childThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token comment">// 由于线程启动规则,主线程中start()之前的操作 happens-before 子线程中的操作</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"子线程: 读取到x = "</span> <span class="token operator">+</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
childThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 启动子线程</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
childThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 规则5:线程终止规则</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">threadTerminationRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== 线程终止规则 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> childThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
y <span class="token operator">=</span> <span class="token number">300</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"子线程: 设置y=300"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
childThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
childThread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 等待子线程结束</span>
<span class="token comment">// 由于线程终止规则,子线程中的操作 happens-before join()的返回</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"主线程: 子线程结束后读取y = "</span> <span class="token operator">+</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">programOrderRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">volatileVariableRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">lockRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">threadStartRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">threadTerminationRule</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_5-内存屏障"><a href="#_5-内存屏障" class="header-anchor">#</a> 5. 内存屏障</h2> <h3 id="_5-1-内存屏障类型"><a href="#_5-1-内存屏障类型" class="header-anchor">#</a> 5.1 内存屏障类型</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token import"><span class="token namespace">sun<span class="token punctuation">.</span>misc<span class="token punctuation">.</span></span><span class="token class-name">Unsafe</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MemoryBarrierDemo</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">Unsafe</span> unsafe<span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Field</span> field <span class="token operator">=</span> <span class="token class-name">Unsafe</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"theUnsafe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
unsafe <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Unsafe</span><span class="token punctuation">)</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token keyword">int</span> volatileVar <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> normalVar1 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> normalVar2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment">// 演示内存屏障的作用</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">demonstrateMemoryBarrier</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=== 内存屏障演示 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> writer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token comment">// 写入普通变量</span>
normalVar1 <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
normalVar2 <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token comment">// 插入StoreStore屏障(通过volatile写实现)</span>
volatileVar <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Writer: 完成写入操作"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token comment">// 读取volatile变量(插入LoadLoad和LoadStore屏障)</span>
<span class="token keyword">int</span> vol <span class="token operator">=</span> volatileVar<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>vol <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 由于内存屏障,这里能看到之前的写入</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Reader: volatileVar="</span> <span class="token operator">+</span> vol <span class="token operator">+</span>
<span class="token string">", normalVar1="</span> <span class="token operator">+</span> normalVar1 <span class="token operator">+</span>
<span class="token string">", normalVar2="</span> <span class="token operator">+</span> normalVar2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
writer<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
reader<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
writer<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
reader<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 使用Unsafe直接操作内存屏障(仅用于演示,实际开发不推荐)</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">unsafeMemoryBarrier</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>unsafe <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Unsafe不可用,跳过演示"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"\n=== Unsafe内存屏障演示 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Thread</span> thread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
normalVar1 <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token comment">// 插入StoreStore屏障</span>
unsafe<span class="token punctuation">.</span><span class="token function">storeFence</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
normalVar2 <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span>
<span class="token comment">// 插入StoreLoad屏障</span>
unsafe<span class="token punctuation">.</span><span class="token function">fullFence</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"使用Unsafe插入内存屏障完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
thread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">demonstrateMemoryBarrier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">unsafeMemoryBarrier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_6-双重检查锁定"><a href="#_6-双重检查锁定" class="header-anchor">#</a> 6. 双重检查锁定</h2> <h3 id="_6-1-单例模式的内存模型问题"><a href="#_6-1-单例模式的内存模型问题" class="header-anchor">#</a> 6.1 单例模式的内存模型问题</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">DoubleCheckedLockingDemo</span> <span class="token punctuation">{</span>
<span class="token comment">// 错误的双重检查锁定实现</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">BrokenSingleton</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">BrokenSingleton</span> instance<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">BrokenSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 模拟复杂的初始化过程</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 存在问题的实现</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">BrokenSingleton</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 第一次检查</span>
<span class="token keyword">synchronized</span> <span class="token punctuation">(</span><span class="token class-name">BrokenSingleton</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 第二次检查</span>
instance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BrokenSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 问题所在</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> instance<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 正确的双重检查锁定实现</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">CorrectSingleton</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">volatile</span> <span class="token class-name">CorrectSingleton</span> instance<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">CorrectSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">CorrectSingleton</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 第一次检查</span>
<span class="token keyword">synchronized</span> <span class="token punctuation">(</span><span class="token class-name">CorrectSingleton</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 第二次检查</span>
instance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CorrectSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// volatile确保正确发布</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> instance<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 基于类初始化的线程安全单例</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">InitializationOnDemandSingleton</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token class-name">InitializationOnDemandSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">InstanceHolder</span> <span class="token punctuation">{</span>
<span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">InitializationOnDemandSingleton</span> <span class="token constant">INSTANCE</span> <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">InitializationOnDemandSingleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">InitializationOnDemandSingleton</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token class-name">InstanceHolder</span><span class="token punctuation">.</span><span class="token constant">INSTANCE</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">testSingletonImplementations</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=== 测试单例模式实现 ==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 测试正确的双重检查锁定</span>
<span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span> threads <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> threads<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
threads<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">CorrectSingleton</span> singleton <span class="token operator">=</span> <span class="token class-name">CorrectSingleton</span><span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"CorrectSingleton实例: "</span> <span class="token operator">+</span>
<span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">identityHashCode</span><span class="token punctuation">(</span>singleton<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span> thread <span class="token operator">:</span> threads<span class="token punctuation">)</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span> thread <span class="token operator">:</span> threads<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
thread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 测试基于类初始化的单例</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">{</span>
<span class="token class-name">InitializationOnDemandSingleton</span> singleton <span class="token operator">=</span>
<span class="token class-name">InitializationOnDemandSingleton</span><span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"InitializationOnDemandSingleton实例: "</span> <span class="token operator">+</span>
<span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">identityHashCode</span><span class="token punctuation">(</span>singleton<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">testSingletonImplementations</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_7-总结"><a href="#_7-总结" class="header-anchor">#</a> 7. 总结</h2> <h3 id="_7-1-关键概念"><a href="#_7-1-关键概念" class="header-anchor">#</a> 7.1 关键概念</h3> <ol><li><strong>Java内存模型</strong>:定义了线程间如何通过内存进行交互的规范</li> <li><strong>主内存与工作内存</strong>:JMM的抽象概念,用于描述变量的存储和访问</li> <li><strong>volatile关键字</strong>:保证可见性和有序性,但不保证原子性</li> <li><strong>happens-before规则</strong>:定义了操作间的偏序关系</li> <li><strong>内存屏障</strong>:防止指令重排序的硬件或软件机制</li></ol> <h3 id="_7-2-最佳实践"><a href="#_7-2-最佳实践" class="header-anchor">#</a> 7.2 最佳实践</h3> <ol><li><strong>正确使用volatile</strong>:用于状态标志、安全发布等场景</li> <li><strong>理解happens-before</strong>:确保线程间的可见性</li> <li><strong>避免双重检查锁定陷阱</strong>:使用volatile或其他线程安全方式</li> <li><strong>选择合适的同步机制</strong>:根据需求选择synchronized、volatile、Lock等</li> <li><strong>关注内存可见性</strong>:在多线程环境中确保数据的正确同步</li></ol> <h3 id="_7-3-常见问题"><a href="#_7-3-常见问题" class="header-anchor">#</a> 7.3 常见问题</h3> <ol><li><strong>可见性问题</strong>:一个线程的修改对其他线程不可见</li> <li><strong>重排序问题</strong>:编译器或处理器的优化导致执行顺序改变</li> <li><strong>原子性问题</strong>:复合操作不是原子的</li> <li><strong>双重检查锁定问题</strong>:不正确的单例实现可能导致问题</li></ol> <p>理解Java内存模型是编写正确并发程序的基础,它帮助我们理解多线程程序的行为,避免常见的并发问题。</p></div></section> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/JavaPlusDoc/thread/java-threadpool-advanced.html" class="prev">
Java线程池深入解析
</a></span> <span class="next"><a href="/JavaPlusDoc/thread/java-concurrency-best-practices.html">
Java并发编程最佳实践
</a></span></p></div> <div class="comments-wrapper"><!----></div></main></div> <!----></div> <ul class="sub-sidebar sub-sidebar-wrapper" style="width:12rem;" data-v-b57cc07c data-v-7dd95ae2><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_1-java内存模型概述" class="sidebar-link reco-side-_1-java内存模型概述" data-v-b57cc07c>1. Java内存模型概述</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_1-1-什么是java内存模型" class="sidebar-link reco-side-_1-1-什么是java内存模型" data-v-b57cc07c>1.1 什么是Java内存模型</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_1-2-主内存与工作内存" class="sidebar-link reco-side-_1-2-主内存与工作内存" data-v-b57cc07c>1.2 主内存与工作内存</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_2-内存间交互操作" class="sidebar-link reco-side-_2-内存间交互操作" data-v-b57cc07c>2. 内存间交互操作</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_2-1-八种基本操作" class="sidebar-link reco-side-_2-1-八种基本操作" data-v-b57cc07c>2.1 八种基本操作</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_3-volatile关键字" class="sidebar-link reco-side-_3-volatile关键字" data-v-b57cc07c>3. volatile关键字</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_3-1-volatile的特性" class="sidebar-link reco-side-_3-1-volatile的特性" data-v-b57cc07c>3.1 volatile的特性</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_3-2-volatile的使用场景" class="sidebar-link reco-side-_3-2-volatile的使用场景" data-v-b57cc07c>3.2 volatile的使用场景</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_4-happens-before规则" class="sidebar-link reco-side-_4-happens-before规则" data-v-b57cc07c>4. happens-before规则</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_4-1-happens-before关系" class="sidebar-link reco-side-_4-1-happens-before关系" data-v-b57cc07c>4.1 happens-before关系</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_5-内存屏障" class="sidebar-link reco-side-_5-内存屏障" data-v-b57cc07c>5. 内存屏障</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_5-1-内存屏障类型" class="sidebar-link reco-side-_5-1-内存屏障类型" data-v-b57cc07c>5.1 内存屏障类型</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_6-双重检查锁定" class="sidebar-link reco-side-_6-双重检查锁定" data-v-b57cc07c>6. 双重检查锁定</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_6-1-单例模式的内存模型问题" class="sidebar-link reco-side-_6-1-单例模式的内存模型问题" data-v-b57cc07c>6.1 单例模式的内存模型问题</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_7-总结" class="sidebar-link reco-side-_7-总结" data-v-b57cc07c>7. 总结</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_7-1-关键概念" class="sidebar-link reco-side-_7-1-关键概念" data-v-b57cc07c>7.1 关键概念</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_7-2-最佳实践" class="sidebar-link reco-side-_7-2-最佳实践" data-v-b57cc07c>7.2 最佳实践</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/thread/java-memory-model.html#_7-3-常见问题" class="sidebar-link reco-side-_7-3-常见问题" data-v-b57cc07c>7.3 常见问题</a></li></ul></div></div></div><div class="global-ui"><div class="back-to-ceiling" style="right:1rem;bottom:6rem;width:2.5rem;height:2.5rem;border-radius:.25rem;line-height:2.5rem;display:none;" data-v-c6073ba8 data-v-c6073ba8><svg t="1574745035067" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5404" class="icon" data-v-c6073ba8><path d="M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z" p-id="5405" data-v-c6073ba8></path><path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z" p-id="5406" data-v-c6073ba8></path></svg></div><!----><div></div><div class="kanbanniang" data-v-5775ee02><div class="banniang-container" style="display:;" data-v-5775ee02><div class="messageBox" style="right:68px;bottom:190px;display:none;" data-v-5775ee02>
欢迎来到 Jeskson-微服务分布式
</div> <div class="operation" style="right:90px;bottom:40px;display:none;" data-v-5775ee02><i class="kbnfont kbn-ban-home ban-home" data-v-5775ee02></i> <i class="kbnfont kbn-ban-message message" data-v-5775ee02></i> <i class="kbnfont kbn-ban-close close" data-v-5775ee02></i> <a target="_blank" href="https://vuepress-theme-reco.recoluan.com/views/plugins/kanbanniang.html" data-v-5775ee02><i class="kbnfont kbn-ban-info info" data-v-5775ee02></i></a> <i class="kbnfont kbn-ban-theme skin" style="display:none;" data-v-5775ee02></i></div> <canvas id="banniang" width="150" height="260" class="live2d" style="width:100px;position:fixed;right:0px;bottom:0px;opacity:0.9;z-index:99999;object-fit:cover;" data-v-5775ee02></canvas></div> <div class="showBanNiang" style="display:none;" data-v-5775ee02>
看板娘
</div></div></div></div>
<script src="/JavaPlusDoc/assets/js/app.ff4b1912.js" defer></script><script src="/JavaPlusDoc/assets/js/7.dfc0397a.js" defer></script><script src="/JavaPlusDoc/assets/js/2.cfbace72.js" defer></script><script src="/JavaPlusDoc/assets/js/1.d59a348b.js" defer></script><script src="/JavaPlusDoc/assets/js/525.c768492d.js" defer></script>
</body>
</html>