-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlinux.html
More file actions
638 lines (536 loc) · 195 KB
/
Copy pathlinux.html
File metadata and controls
638 lines (536 loc) · 195 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
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>linux线程基础 | 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/202.b803e840.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/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/525.c768492d.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" class="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" aria-current="page" class="active 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>linux线程基础</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">linux线程基础</h1> <div data-v-8a445198><i class="iconfont reco-account" data-v-8a445198><span data-v-8a445198>哪吒</span></i> <i class="iconfont reco-date" data-v-8a445198><span data-v-8a445198>2023/6/15</span></i> <!----> <!----></div></div> <div class="theme-reco-content content__default"><h1 id="linux线程基础"><a href="#linux线程基础" class="header-anchor">#</a> Linux线程基础</h1> <h2 id="_1-线程概念与特性"><a href="#_1-线程概念与特性" class="header-anchor">#</a> 1. 线程概念与特性</h2> <h3 id="_1-1-什么是线程"><a href="#_1-1-什么是线程" class="header-anchor">#</a> 1.1 什么是线程</h3> <p>线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span>
<span class="token comment">// 线程函数示例</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">thread_function</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> thread_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程 %d 正在运行\n"</span><span class="token punctuation">,</span> thread_id<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 function">printf</span><span class="token punctuation">(</span><span class="token string">"线程 %d: 工作步骤 %d\n"</span><span class="token punctuation">,</span> thread_id<span class="token punctuation">,</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程 %d 完成工作\n"</span><span class="token punctuation">,</span> thread_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_1-2-线程与进程的区别"><a href="#_1-2-线程与进程的区别" class="header-anchor">#</a> 1.2 线程与进程的区别</h3> <table><thead><tr><th>特性</th> <th>进程</th> <th>线程</th></tr></thead> <tbody><tr><td>资源占用</td> <td>独立的内存空间</td> <td>共享进程内存空间</td></tr> <tr><td>创建开销</td> <td>较大</td> <td>较小</td></tr> <tr><td>通信方式</td> <td>IPC(管道、消息队列等)</td> <td>共享内存、信号量</td></tr> <tr><td>切换开销</td> <td>较大</td> <td>较小</td></tr> <tr><td>独立性</td> <td>高度独立</td> <td>相互依赖</td></tr></tbody></table> <h3 id="_1-3-线程的优势"><a href="#_1-3-线程的优势" class="header-anchor">#</a> 1.3 线程的优势</h3> <ul><li><strong>并发执行</strong>:多个线程可以同时执行不同的任务</li> <li><strong>资源共享</strong>:线程间可以方便地共享数据</li> <li><strong>响应性</strong>:提高程序的响应速度</li> <li><strong>经济性</strong>:创建和切换开销小</li></ul> <h2 id="_2-posix线程-pthread"><a href="#_2-posix线程-pthread" class="header-anchor">#</a> 2. POSIX线程(pthread)</h2> <h3 id="_2-1-pthread库简介"><a href="#_2-1-pthread库简介" class="header-anchor">#</a> 2.1 pthread库简介</h3> <p>POSIX线程(pthread)是Linux系统中标准的线程API,提供了创建、管理和同步线程的函数。</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token comment">// 编译时需要链接pthread库</span>
<span class="token comment">// gcc -o program program.c -lpthread</span>
</code></pre></div><h3 id="_2-2-线程创建与管理"><a href="#_2-2-线程创建与管理" class="header-anchor">#</a> 2.2 线程创建与管理</h3> <h4 id="创建线程"><a href="#创建线程" class="header-anchor">#</a> 创建线程</h4> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">pthread_t</span> thread1<span class="token punctuation">,</span> thread2<span class="token punctuation">;</span>
<span class="token keyword">int</span> thread1_id <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> thread2_id <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> result<span class="token punctuation">;</span>
<span class="token comment">// 创建线程1</span>
result <span class="token operator">=</span> <span class="token function">pthread_create</span><span class="token punctuation">(</span><span class="token operator">&</span>thread1<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> thread_function<span class="token punctuation">,</span> <span class="token operator">&</span>thread1_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"创建线程1失败\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建线程2</span>
result <span class="token operator">=</span> <span class="token function">pthread_create</span><span class="token punctuation">(</span><span class="token operator">&</span>thread2<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> thread_function<span class="token punctuation">,</span> <span class="token operator">&</span>thread2_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"创建线程2失败\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</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 comment">// 等待线程完成</span>
<span class="token function">pthread_join</span><span class="token punctuation">(</span>thread1<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_join</span><span class="token punctuation">(</span>thread2<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</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 keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h4 id="线程属性设置"><a href="#线程属性设置" class="header-anchor">#</a> 线程属性设置</h4> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token keyword">void</span> <span class="token function">create_detached_thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">pthread_t</span> thread<span class="token punctuation">;</span>
<span class="token class-name">pthread_attr_t</span> attr<span class="token punctuation">;</span>
<span class="token comment">// 初始化线程属性</span>
<span class="token function">pthread_attr_init</span><span class="token punctuation">(</span><span class="token operator">&</span>attr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 设置为分离状态</span>
<span class="token function">pthread_attr_setdetachstate</span><span class="token punctuation">(</span><span class="token operator">&</span>attr<span class="token punctuation">,</span> PTHREAD_CREATE_DETACHED<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 设置栈大小</span>
<span class="token class-name">size_t</span> stack_size <span class="token operator">=</span> <span class="token number">1024</span> <span class="token operator">*</span> <span class="token number">1024</span><span class="token punctuation">;</span> <span class="token comment">// 1MB</span>
<span class="token function">pthread_attr_setstacksize</span><span class="token punctuation">(</span><span class="token operator">&</span>attr<span class="token punctuation">,</span> stack_size<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 创建线程</span>
<span class="token function">pthread_create</span><span class="token punctuation">(</span><span class="token operator">&</span>thread<span class="token punctuation">,</span> <span class="token operator">&</span>attr<span class="token punctuation">,</span> thread_function<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 销毁属性对象</span>
<span class="token function">pthread_attr_destroy</span><span class="token punctuation">(</span><span class="token operator">&</span>attr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_3-线程同步机制"><a href="#_3-线程同步机制" class="header-anchor">#</a> 3. 线程同步机制</h2> <h3 id="_3-1-互斥锁-mutex"><a href="#_3-1-互斥锁-mutex" class="header-anchor">#</a> 3.1 互斥锁(Mutex)</h3> <p>互斥锁用于保护共享资源,确保同一时间只有一个线程可以访问临界区。</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span>
<span class="token comment">// 全局变量和互斥锁</span>
<span class="token keyword">int</span> shared_counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token class-name">pthread_mutex_t</span> counter_mutex <span class="token operator">=</span> PTHREAD_MUTEX_INITIALIZER<span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">increment_counter</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> thread_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<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">100000</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">// 加锁</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>counter_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 临界区:修改共享变量</span>
shared_counter<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token comment">// 解锁</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>counter_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程 %d 完成计数\n"</span><span class="token punctuation">,</span> thread_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">pthread_t</span> threads<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> thread_ids<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</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 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">3</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 function">pthread_create</span><span class="token punctuation">(</span><span class="token operator">&</span>threads<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> increment_counter<span class="token punctuation">,</span> <span class="token operator">&</span>thread_ids<span class="token punctuation">[</span>i<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">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">3</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 function">pthread_join</span><span class="token punctuation">(</span>threads<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"最终计数值: %d\n"</span><span class="token punctuation">,</span> shared_counter<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 销毁互斥锁</span>
<span class="token function">pthread_mutex_destroy</span><span class="token punctuation">(</span><span class="token operator">&</span>counter_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_3-2-条件变量-condition-variable"><a href="#_3-2-条件变量-condition-variable" class="header-anchor">#</a> 3.2 条件变量(Condition Variable)</h3> <p>条件变量用于线程间的条件同步,允许线程等待特定条件的发生。</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span>
<span class="token comment">// 生产者-消费者模型</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">BUFFER_SIZE</span> <span class="token expression"><span class="token number">10</span></span></span>
<span class="token keyword">int</span> buffer<span class="token punctuation">[</span>BUFFER_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> buffer_count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> in <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> out <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token class-name">pthread_mutex_t</span> buffer_mutex <span class="token operator">=</span> PTHREAD_MUTEX_INITIALIZER<span class="token punctuation">;</span>
<span class="token class-name">pthread_cond_t</span> buffer_not_full <span class="token operator">=</span> PTHREAD_COND_INITIALIZER<span class="token punctuation">;</span>
<span class="token class-name">pthread_cond_t</span> buffer_not_empty <span class="token operator">=</span> PTHREAD_COND_INITIALIZER<span class="token punctuation">;</span>
<span class="token comment">// 生产者线程</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">producer</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> producer_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<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">20</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 function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 等待缓冲区不满</span>
<span class="token keyword">while</span><span class="token punctuation">(</span>buffer_count <span class="token operator">==</span> BUFFER_SIZE<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"生产者 %d: 缓冲区满,等待...\n"</span><span class="token punctuation">,</span> producer_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_cond_wait</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_not_full<span class="token punctuation">,</span> <span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 生产数据</span>
<span class="token keyword">int</span> item <span class="token operator">=</span> i <span class="token operator">+</span> producer_id <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">[</span>in<span class="token punctuation">]</span> <span class="token operator">=</span> item<span class="token punctuation">;</span>
in <span class="token operator">=</span> <span class="token punctuation">(</span>in <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> BUFFER_SIZE<span class="token punctuation">;</span>
buffer_count<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"生产者 %d: 生产了 %d,缓冲区数量: %d\n"</span><span class="token punctuation">,</span>
producer_id<span class="token punctuation">,</span> item<span class="token punctuation">,</span> buffer_count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 通知消费者</span>
<span class="token function">pthread_cond_signal</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_not_empty<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">100000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0.1秒</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 消费者线程</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">consumer</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> consumer_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<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">20</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 function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 等待缓冲区不空</span>
<span class="token keyword">while</span><span class="token punctuation">(</span>buffer_count <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"消费者 %d: 缓冲区空,等待...\n"</span><span class="token punctuation">,</span> consumer_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_cond_wait</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_not_empty<span class="token punctuation">,</span> <span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 消费数据</span>
<span class="token keyword">int</span> item <span class="token operator">=</span> buffer<span class="token punctuation">[</span>out<span class="token punctuation">]</span><span class="token punctuation">;</span>
out <span class="token operator">=</span> <span class="token punctuation">(</span>out <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> BUFFER_SIZE<span class="token punctuation">;</span>
buffer_count<span class="token operator">--</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"消费者 %d: 消费了 %d,缓冲区数量: %d\n"</span><span class="token punctuation">,</span>
consumer_id<span class="token punctuation">,</span> item<span class="token punctuation">,</span> buffer_count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 通知生产者</span>
<span class="token function">pthread_cond_signal</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_not_full<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>buffer_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">150000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0.15秒</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_3-3-读写锁-read-write-lock"><a href="#_3-3-读写锁-read-write-lock" class="header-anchor">#</a> 3.3 读写锁(Read-Write Lock)</h3> <p>读写锁允许多个读者同时访问,但写者独占访问。</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span>
<span class="token comment">// 共享数据和读写锁</span>
<span class="token keyword">int</span> shared_data <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token class-name">pthread_rwlock_t</span> data_rwlock <span class="token operator">=</span> PTHREAD_RWLOCK_INITIALIZER<span class="token punctuation">;</span>
<span class="token comment">// 读者线程</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">reader</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> reader_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<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">// 获取读锁</span>
<span class="token function">pthread_rwlock_rdlock</span><span class="token punctuation">(</span><span class="token operator">&</span>data_rwlock<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"读者 %d: 读取数据 = %d\n"</span><span class="token punctuation">,</span> reader_id<span class="token punctuation">,</span> shared_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 释放读锁</span>
<span class="token function">pthread_rwlock_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>data_rwlock<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1</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 constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 写者线程</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">writer</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> writer_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<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">3</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">// 获取写锁</span>
<span class="token function">pthread_rwlock_wrlock</span><span class="token punctuation">(</span><span class="token operator">&</span>data_rwlock<span class="token punctuation">)</span><span class="token punctuation">;</span>
shared_data <span class="token operator">+=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"写者 %d: 写入数据 = %d\n"</span><span class="token punctuation">,</span> writer_id<span class="token punctuation">,</span> shared_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 释放写锁</span>
<span class="token function">pthread_rwlock_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>data_rwlock<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">2</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 constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="_4-线程池实现"><a href="#_4-线程池实现" class="header-anchor">#</a> 4. 线程池实现</h2> <h3 id="_4-1-简单线程池设计"><a href="#_4-1-简单线程池设计" class="header-anchor">#</a> 4.1 简单线程池设计</h3> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><pthread.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">MAX_THREADS</span> <span class="token expression"><span class="token number">4</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">MAX_QUEUE</span> <span class="token expression"><span class="token number">100</span></span></span>
<span class="token comment">// 任务结构</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span>
<span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>function<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> argument<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token class-name">task_t</span><span class="token punctuation">;</span>
<span class="token comment">// 线程池结构</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span>
<span class="token class-name">pthread_t</span> threads<span class="token punctuation">[</span>MAX_THREADS<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token class-name">task_t</span> task_queue<span class="token punctuation">[</span>MAX_QUEUE<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> queue_front<span class="token punctuation">;</span>
<span class="token keyword">int</span> queue_rear<span class="token punctuation">;</span>
<span class="token keyword">int</span> queue_size<span class="token punctuation">;</span>
<span class="token keyword">int</span> shutdown<span class="token punctuation">;</span>
<span class="token class-name">pthread_mutex_t</span> queue_mutex<span class="token punctuation">;</span>
<span class="token class-name">pthread_cond_t</span> queue_not_empty<span class="token punctuation">;</span>
<span class="token class-name">pthread_cond_t</span> queue_not_full<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token class-name">thread_pool_t</span><span class="token punctuation">;</span>
<span class="token class-name">thread_pool_t</span> pool<span class="token punctuation">;</span>
<span class="token comment">// 工作线程函数</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">worker_thread</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 等待任务</span>
<span class="token keyword">while</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span>queue_size <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&&</span> <span class="token operator">!</span>pool<span class="token punctuation">.</span>shutdown<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_cond_wait</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_empty<span class="token punctuation">,</span> <span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 检查是否需要关闭</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span>shutdown<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<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 comment">// 取出任务</span>
<span class="token class-name">task_t</span> task <span class="token operator">=</span> pool<span class="token punctuation">.</span>task_queue<span class="token punctuation">[</span>pool<span class="token punctuation">.</span>queue_front<span class="token punctuation">]</span><span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_front <span class="token operator">=</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span>queue_front <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> MAX_QUEUE<span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_size<span class="token operator">--</span><span class="token punctuation">;</span>
<span class="token comment">// 通知可以添加新任务</span>
<span class="token function">pthread_cond_signal</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_full<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 执行任务</span>
task<span class="token punctuation">.</span><span class="token function">function</span><span class="token punctuation">(</span>task<span class="token punctuation">.</span>argument<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 初始化线程池</span>
<span class="token keyword">void</span> <span class="token function">thread_pool_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
pool<span class="token punctuation">.</span>queue_front <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_rear <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_size <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>shutdown <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_init</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_cond_init</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_empty<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_cond_init</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_full<span class="token punctuation">,</span> <span class="token constant">NULL</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> MAX_THREADS<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_create</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>threads<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> worker_thread<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程池初始化完成,创建了 %d 个工作线程\n"</span><span class="token punctuation">,</span> MAX_THREADS<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 添加任务到线程池</span>
<span class="token keyword">void</span> <span class="token function">thread_pool_add_task</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>function<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">void</span><span class="token operator">*</span> argument<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 等待队列不满</span>
<span class="token keyword">while</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span>queue_size <span class="token operator">==</span> MAX_QUEUE<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_cond_wait</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_full<span class="token punctuation">,</span> <span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 添加任务</span>
pool<span class="token punctuation">.</span>task_queue<span class="token punctuation">[</span>pool<span class="token punctuation">.</span>queue_rear<span class="token punctuation">]</span><span class="token punctuation">.</span>function <span class="token operator">=</span> function<span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>task_queue<span class="token punctuation">[</span>pool<span class="token punctuation">.</span>queue_rear<span class="token punctuation">]</span><span class="token punctuation">.</span>argument <span class="token operator">=</span> argument<span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_rear <span class="token operator">=</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span>queue_rear <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> MAX_QUEUE<span class="token punctuation">;</span>
pool<span class="token punctuation">.</span>queue_size<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token comment">// 通知工作线程</span>
<span class="token function">pthread_cond_signal</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_not_empty<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>pool<span class="token punctuation">.</span>queue_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 示例任务函数</span>
<span class="token keyword">void</span> <span class="token function">example_task</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> task_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"执行任务 %d,线程ID: %lu\n"</span><span class="token punctuation">,</span> task_id<span class="token punctuation">,</span> <span class="token function">pthread_self</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">sleep</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 模拟工作</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"任务 %d 完成\n"</span><span class="token punctuation">,</span> task_id<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> <p>线程安全是指在多线程环境下,程序能够正确地处理多个线程同时访问共享资源的情况。</p> <h3 id="_5-2-常见的线程安全问题"><a href="#_5-2-常见的线程安全问题" class="header-anchor">#</a> 5.2 常见的线程安全问题</h3> <h4 id="竞态条件-race-condition"><a href="#竞态条件-race-condition" class="header-anchor">#</a> 竞态条件(Race Condition)</h4> <div class="language-c extra-class"><pre class="language-c"><code><span class="token comment">// 不安全的代码示例</span>
<span class="token keyword">int</span> global_counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">unsafe_increment</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<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> <span class="token number">100000</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">// 这里存在竞态条件</span>
global_counter<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// 非原子操作</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 安全的代码示例</span>
<span class="token class-name">pthread_mutex_t</span> safe_mutex <span class="token operator">=</span> PTHREAD_MUTEX_INITIALIZER<span class="token punctuation">;</span>
<span class="token keyword">int</span> safe_counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">safe_increment</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<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> <span class="token number">100000</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 function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>safe_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
safe_counter<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// 受保护的操作</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>safe_mutex<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h4 id="死锁-deadlock"><a href="#死锁-deadlock" class="header-anchor">#</a> 死锁(Deadlock)</h4> <div class="language-c extra-class"><pre class="language-c"><code><span class="token comment">// 可能导致死锁的代码</span>
<span class="token class-name">pthread_mutex_t</span> mutex1 <span class="token operator">=</span> PTHREAD_MUTEX_INITIALIZER<span class="token punctuation">;</span>
<span class="token class-name">pthread_mutex_t</span> mutex2 <span class="token operator">=</span> PTHREAD_MUTEX_INITIALIZER<span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">thread1_func</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程1获得mutex1\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 可能死锁</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程1获得mutex2\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">thread2_func</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程2获得mutex2\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 可能死锁</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程2获得mutex1\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 避免死锁的方法:统一加锁顺序</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">safe_thread1_func</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 总是先锁mutex1</span>
<span class="token function">pthread_mutex_lock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 再锁mutex2</span>
<span class="token comment">// 执行工作</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">pthread_mutex_unlock</span><span class="token punctuation">(</span><span class="token operator">&</span>mutex1<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_5-3-最佳实践"><a href="#_5-3-最佳实践" class="header-anchor">#</a> 5.3 最佳实践</h3> <ol><li><strong>最小化锁的范围</strong>:只在必要时加锁,尽快释放</li> <li><strong>避免嵌套锁</strong>:减少死锁的可能性</li> <li><strong>使用RAII模式</strong>:确保资源正确释放</li> <li><strong>优先使用高级同步原语</strong>:如条件变量、读写锁</li> <li><strong>线程局部存储</strong>:减少共享数据</li></ol> <div class="language-c extra-class"><pre class="language-c"><code><span class="token comment">// 线程局部存储示例</span>
__thread <span class="token keyword">int</span> thread_local_var <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">thread_function</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> thread_id <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token punctuation">)</span>arg<span class="token punctuation">;</span>
<span class="token comment">// 每个线程都有自己的副本</span>
thread_local_var <span class="token operator">=</span> thread_id <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程 %d 的局部变量: %d\n"</span><span class="token punctuation">,</span> thread_id<span class="token punctuation">,</span> thread_local_var<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</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-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sys/time.h></span></span>
<span class="token comment">// 性能计时器</span>
<span class="token keyword">double</span> <span class="token function">get_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">struct</span> <span class="token class-name">timeval</span> tv<span class="token punctuation">;</span>
<span class="token function">gettimeofday</span><span class="token punctuation">(</span><span class="token operator">&</span>tv<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> tv<span class="token punctuation">.</span>tv_sec <span class="token operator">+</span> tv<span class="token punctuation">.</span>tv_usec <span class="token operator">/</span> <span class="token number">1000000.0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span><span class="token operator">*</span> <span class="token function">performance_test_thread</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token operator">*</span> arg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">double</span> start_time <span class="token operator">=</span> <span class="token function">get_time</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">1000000</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">// 模拟计算</span>
<span class="token punctuation">}</span>
<span class="token keyword">double</span> end_time <span class="token operator">=</span> <span class="token function">get_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"线程执行时间: %.6f 秒\n"</span><span class="token punctuation">,</span> end_time <span class="token operator">-</span> start_time<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><h3 id="_6-2-调试技巧"><a href="#_6-2-调试技巧" class="header-anchor">#</a> 6.2 调试技巧</h3> <div class="language-bash extra-class"><pre class="language-bash"><code><span class="token comment"># 使用gdb调试多线程程序</span>
gdb ./program
<span class="token punctuation">(</span>gdb<span class="token punctuation">)</span> <span class="token builtin class-name">set</span> scheduler-locking on <span class="token comment"># 锁定调度器</span>
<span class="token punctuation">(</span>gdb<span class="token punctuation">)</span> info threads <span class="token comment"># 查看所有线程</span>
<span class="token punctuation">(</span>gdb<span class="token punctuation">)</span> thread <span class="token number">2</span> <span class="token comment"># 切换到线程2</span>
<span class="token punctuation">(</span>gdb<span class="token punctuation">)</span> bt <span class="token comment"># 查看调用栈</span>
<span class="token comment"># 使用valgrind检测线程问题</span>
valgrind <span class="token parameter variable">--tool</span><span class="token operator">=</span>helgrind ./program
valgrind <span class="token parameter variable">--tool</span><span class="token operator">=</span>drd ./program
</code></pre></div><h2 id="_7-总结"><a href="#_7-总结" class="header-anchor">#</a> 7. 总结</h2> <p>Linux线程编程是系统编程的重要组成部分,掌握以下要点:</p> <ul><li><strong>基础概念</strong>:理解线程与进程的区别</li> <li><strong>POSIX线程</strong>:熟练使用pthread API</li> <li><strong>同步机制</strong>:正确使用互斥锁、条件变量、读写锁</li> <li><strong>线程安全</strong>:避免竞态条件和死锁</li> <li><strong>性能优化</strong>:合理设计线程架构</li> <li><strong>调试技巧</strong>:使用专业工具定位问题</li></ul> <p>通过实践这些概念和技术,可以编写出高效、安全的多线程程序。</p></div></section> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/JavaPlusDoc/thread/threadpool-executor.html" class="prev">
ThreadPoolExecutor详解
</a></span> <span class="next"><a href="/JavaPlusDoc/aThread/jvm.html">
jvm基础知识
</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/aThread/linux.html#_1-线程概念与特性" class="sidebar-link reco-side-_1-线程概念与特性" data-v-b57cc07c>1. 线程概念与特性</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_1-1-什么是线程" class="sidebar-link reco-side-_1-1-什么是线程" data-v-b57cc07c>1.1 什么是线程</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_1-2-线程与进程的区别" class="sidebar-link reco-side-_1-2-线程与进程的区别" data-v-b57cc07c>1.2 线程与进程的区别</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_1-3-线程的优势" class="sidebar-link reco-side-_1-3-线程的优势" data-v-b57cc07c>1.3 线程的优势</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_2-posix线程-pthread" class="sidebar-link reco-side-_2-posix线程-pthread" data-v-b57cc07c>2. POSIX线程(pthread)</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_2-1-pthread库简介" class="sidebar-link reco-side-_2-1-pthread库简介" data-v-b57cc07c>2.1 pthread库简介</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_2-2-线程创建与管理" class="sidebar-link reco-side-_2-2-线程创建与管理" data-v-b57cc07c>2.2 线程创建与管理</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_3-线程同步机制" class="sidebar-link reco-side-_3-线程同步机制" data-v-b57cc07c>3. 线程同步机制</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_3-1-互斥锁-mutex" class="sidebar-link reco-side-_3-1-互斥锁-mutex" data-v-b57cc07c>3.1 互斥锁(Mutex)</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_3-2-条件变量-condition-variable" class="sidebar-link reco-side-_3-2-条件变量-condition-variable" data-v-b57cc07c>3.2 条件变量(Condition Variable)</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_3-3-读写锁-read-write-lock" class="sidebar-link reco-side-_3-3-读写锁-read-write-lock" data-v-b57cc07c>3.3 读写锁(Read-Write Lock)</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_4-线程池实现" class="sidebar-link reco-side-_4-线程池实现" data-v-b57cc07c>4. 线程池实现</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_4-1-简单线程池设计" class="sidebar-link reco-side-_4-1-简单线程池设计" data-v-b57cc07c>4.1 简单线程池设计</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_5-线程安全与最佳实践" class="sidebar-link reco-side-_5-线程安全与最佳实践" data-v-b57cc07c>5. 线程安全与最佳实践</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_5-1-线程安全的概念" class="sidebar-link reco-side-_5-1-线程安全的概念" data-v-b57cc07c>5.1 线程安全的概念</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_5-2-常见的线程安全问题" class="sidebar-link reco-side-_5-2-常见的线程安全问题" data-v-b57cc07c>5.2 常见的线程安全问题</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_5-3-最佳实践" class="sidebar-link reco-side-_5-3-最佳实践" data-v-b57cc07c>5.3 最佳实践</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_6-性能优化与调试" class="sidebar-link reco-side-_6-性能优化与调试" data-v-b57cc07c>6. 性能优化与调试</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_6-1-性能监控" class="sidebar-link reco-side-_6-1-性能监控" data-v-b57cc07c>6.1 性能监控</a></li><li class="level-3" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_6-2-调试技巧" class="sidebar-link reco-side-_6-2-调试技巧" data-v-b57cc07c>6.2 调试技巧</a></li><li class="level-2" data-v-b57cc07c><a href="/JavaPlusDoc/aThread/linux.html#_7-总结" class="sidebar-link reco-side-_7-总结" data-v-b57cc07c>7. 总结</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/202.b803e840.js" defer></script>
</body>
</html>