-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsynchronized的实现原理和应用.html
1499 lines (773 loc) · 47.2 KB
/
synchronized的实现原理和应用.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="theme-next gemini use-motion" lang="zh-CN">
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script>
<link href="//cdn.bootcss.com/pace/1.0.2/themes/pink/pace-theme-flash.css" rel="stylesheet">
<style>
.pace .pace-progress {
background: #1E92FB; /*进度条颜色*/
height: 3px;
}
.pace .pace-progress-inner {
box-shadow: 0 0 10px #1E92FB, 0 0 5px #1E92FB; /*阴影颜色*/
}
.pace .pace-activity {
border-top-color: #1E92FB; /*上边框颜色*/
border-left-color: #1E92FB; /*左边框颜色*/
}
</style>
<script src="/lib/pace/pace.min.js?v=1.0.2"></script>
<link rel="stylesheet" href="/lib/pace/pace-theme-minimal.min.css?v=1.0.2">
<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2">
<link rel="stylesheet" href="/css/main.css?v=7.1.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=7.1.0">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon.ico?v=7.1.0">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.ico?v=7.1.0">
<link rel="mask-icon" href="/images/logo.svg?v=7.1.0" color="#222">
<script id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Gemini',
version: '7.1.0',
sidebar: {"position":"left","display":"post","offset":12,"onmobile":false,"dimmer":false},
back2top: true,
back2top_sidebar: false,
fancybox: false,
fastclick: false,
lazyload: false,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<meta name="description" content="前言下班回来无事,电视剧没更新,吃鸡没队友,无奈打开电脑,看见旁边落灰已久的《Java并发编程的艺术》随手拿起来翻了几页,作为程序员的我感觉发现了新大陆,瞬间一发不可收拾,越看越有意思。现在想想我为什么要买这本书呢,其实从工作以来,一直就在看这方面的内容,奈何网络上知识零碎,加上理解有差,所以买回来看看,看看完整的。增加自己知识的完整度。 对于这种工具书,我的观念是千万不能看PDF和各种电子的,工">
<meta name="keywords" content="JAVA,并发">
<meta property="og:type" content="article">
<meta property="og:title" content="synchronized的实现原理和应用">
<meta property="og:url" content="https://Zhucong123.github.io/synchronized的实现原理和应用.html">
<meta property="og:site_name" content="Congz | Blog">
<meta property="og:description" content="前言下班回来无事,电视剧没更新,吃鸡没队友,无奈打开电脑,看见旁边落灰已久的《Java并发编程的艺术》随手拿起来翻了几页,作为程序员的我感觉发现了新大陆,瞬间一发不可收拾,越看越有意思。现在想想我为什么要买这本书呢,其实从工作以来,一直就在看这方面的内容,奈何网络上知识零碎,加上理解有差,所以买回来看看,看看完整的。增加自己知识的完整度。 对于这种工具书,我的观念是千万不能看PDF和各种电子的,工">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://zhucong123.github.io/synchronized的实现原理和应用/1.png">
<meta property="og:image" content="https://zhucong123.github.io/synchronized的实现原理和应用/2.png">
<meta property="og:updated_time" content="2019-08-07T00:40:54.063Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="synchronized的实现原理和应用">
<meta name="twitter:description" content="前言下班回来无事,电视剧没更新,吃鸡没队友,无奈打开电脑,看见旁边落灰已久的《Java并发编程的艺术》随手拿起来翻了几页,作为程序员的我感觉发现了新大陆,瞬间一发不可收拾,越看越有意思。现在想想我为什么要买这本书呢,其实从工作以来,一直就在看这方面的内容,奈何网络上知识零碎,加上理解有差,所以买回来看看,看看完整的。增加自己知识的完整度。 对于这种工具书,我的观念是千万不能看PDF和各种电子的,工">
<meta name="twitter:image" content="https://zhucong123.github.io/synchronized的实现原理和应用/1.png">
<link rel="alternate" href="/atom.xml" title="Congz | Blog" type="application/atom+xml">
<link rel="canonical" href="https://Zhucong123.github.io/synchronized的实现原理和应用">
<script id="page.configurations">
CONFIG.page = {
sidebar: "",
};
</script>
<title>synchronized的实现原理和应用 | Congz | Blog</title>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?9462705702727bdff9e7bd016db7169c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<noscript>
<style>
.use-motion .motion-element,
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-title { opacity: initial; }
.use-motion .logo,
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">
<div class="container sidebar-position-left page-post-detail">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Congz | Blog</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle">静坐常思己过,闲谈莫论人非</p>
</div>
<div class="site-nav-toggle">
<button aria-label="切换导航栏">
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br>首页</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br>标签</a>
</li>
<li class="menu-item menu-item-categories">
<a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i> <br>分类</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i> <br>归档</a>
</li>
<li class="menu-item menu-item-search">
<a href="javascript:;" class="popup-trigger">
<i class="menu-item-icon fa fa-search fa-fw"></i> <br>搜索</a>
</li>
</ul>
<div class="site-search">
<div class="popup search-popup local-search-popup">
<div class="local-search-header clearfix">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<span class="popup-btn-close">
<i class="fa fa-times-circle"></i>
</span>
<div class="local-search-input-wrapper">
<input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
</div>
</div>
<div id="local-search-result"></div>
</div>
</div>
</nav>
</div>
</header>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<div id="posts" class="posts-expand">
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://Zhucong123.github.io/synchronized的实现原理和应用.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Congz">
<meta itemprop="description" content="平平淡淡,任其自然">
<meta itemprop="image" content="/images/avatar.gif">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Congz | Blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">synchronized的实现原理和应用
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-05-29 19:17:09" itemprop="dateCreated datePublished" datetime="2019-05-29T19:17:09+08:00">2019-05-29</time>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2019-08-07 08:40:54" itemprop="dateModified" datetime="2019-08-07T08:40:54+08:00">2019-08-07</time>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/并发/" itemprop="url" rel="index"><span itemprop="name">并发</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/synchronized的实现原理和应用.html#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/synchronized的实现原理和应用.html" itemprop="commentCount"></span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
阅读次数:
<span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
</span>
<div class="post-symbolscount">
<span class="post-meta-item-icon">
<i class="fa fa-file-word-o"></i>
</span>
<span class="post-meta-item-text">本文字数:</span>
<span title="本文字数">2.7k</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-clock-o"></i>
</span>
<span class="post-meta-item-text">阅读时长 ≈</span>
<span title="阅读时长">2 分钟</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>下班回来无事,电视剧没更新,吃鸡没队友,无奈打开电脑,看见旁边落灰已久的《Java并发编程的艺术》随手拿起来翻了几页,作为程序员的我感觉发现了新大陆,瞬间一发不可收拾,越看越有意思。现在想想我为什么要买这本书呢,其实从工作以来,一直就在看这方面的内容,奈何网络上知识零碎,加上理解有差,所以买回来看看,看看完整的。增加自己知识的完整度。</p>
<p>对于这种工具书,我的观念是千万不能看PDF和各种电子的,工具书就是要做到及时,随看随翻,可以当成字典用,需要什么翻什么,也切记从头读到尾,我的做法是,对哪方面感兴趣就去看哪,毕竟工具书没有剧情的,上下文跳着看不影响的。还有一定要记得看了之后做笔记,也就是我现在做的事,不然看了之后用不上,时间久了等于白看。好了,不多说废话了,今天看了关于标题内容的一节,记录一下,文章不长。毕竟信书不如无书,肯定看了之后加上我的理解才有了这篇文章</p>
<h4 id="好,开始!"><a href="#好,开始!" class="headerlink" title="好,开始!"></a>好,开始!</h4><p>说到synchronized,这个在java开发工程师眼中肯定不陌生,Hashtable和currentHashMap的源码都是有这个的,不信打开你们的idea 然后ctrl+H(我的是这个快捷键)看看你们项目中有多少用到这个方法了。</p>
<p>很多人都程序它为重量级锁,就是当你锁住了一个方法,或者锁住了一个方法块,则其他线程就进不来,如果当前锁的时间耗时比较长,则会影响程序性能。但是jdk 1.6对synchronized进行了优化,有些情况他就不那么重了,这里详细介绍jdk1.6为了减少获得锁和释放锁带来的性能小号而引入的偏向锁和轻量级锁以及所得存储结构和升级过程。</p>
<h4 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h4><h5 id="锁的3种表现形式"><a href="#锁的3种表现形式" class="headerlink" title="锁的3种表现形式"></a>锁的3种表现形式</h5><p>如果锁住了普通方法,则synchronized锁住的是当前对象(方法)</p>
<p>如果锁住了静态的方法,则synchronized锁住的是当前类的Class对象</p>
<p>如果锁住了一个方法块,及synchronized{},则锁的是中括号里面的对象,来看看代码吧</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">//锁住的是当前方法</span><br><span class="line">public synchronized demo{</span><br><span class="line"> //dosomething</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//此时锁会升级,锁住demo1这个类</span><br><span class="line">class demo1{</span><br><span class="line"> public static synchronized demo{</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//这个只会锁住当前{}里面的内容</span><br><span class="line">synchronized{</span><br><span class="line"> //dosomthing</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>当一个线程试图访问同步的代码块是,他必须要先得到锁,退出或抛出异常时必须释放锁</p>
<p>JVM规范中可以看到synchronized是基于进入和退出Monitor对象来实现方法的同步和代码块的同步,但两者的现实细节不一样,代码块同步是用的monitorenter和monitorexit指令现实的,而方法同步是用的另外一种方法,但是都可以用这两个指令来实现,这里我曾经有幸看过字节码,确实是这样的,我就不翻出来看了。</p>
<p>monitorenter指令时在编译后插入到同步代码块的开始位置,而monitorexit则插入在方法结束和异常的地方,JVM要保证每个monitorenter都有一个monitorexit与之配对,任何对象都有一个monitor与之关联,当一个monitor被持有之后,他就会处于锁定状态,线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor所有权,即尝试获得对象锁</p>
<h5 id="锁的升级和对比"><a href="#锁的升级和对比" class="headerlink" title="锁的升级和对比"></a>锁的升级和对比</h5><p>书看到这里其实已经不是很懂了,本来想上网搜一下,偏向锁和轻量级锁的原理的,发现网上那些都和我这本书上的一样,哈,我想说我书买对了。</p>
<p>继续吧!</p>
<p>上文说过了,为了性能提升,引入了偏向锁和轻量级锁,锁一共有4中状态,级别从低到高分别是,无锁状态 -></p>
<p>偏向锁状态 -> 轻量级锁状态 -> 重量级锁状态,这个状态会随着锁的竞争情况去升级,而且只能升级,不能降级,就是只能从偏向锁到轻量级锁,不能从轻量级锁到偏向锁。 </p>
<h6 id="偏向锁"><a href="#偏向锁" class="headerlink" title="偏向锁"></a>偏向锁</h6><p>偏向锁适用于只有一个线程访问同步块的场景</p>
<p>HotSpot的作者研究发现大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得,所以为了减少线程获得锁的代价,则引入了偏向锁。当一个线程访问同步块的代码的时候,会在对象头和栈帧中存入这个线程的ID,就相当于是做一个标记,如果下次该线程在来获取这个锁的时候,就不需要进行CAS操作来加锁和解锁了,只需要简单的判断一下对象头的Mark Word里面的ID是不是和当前访问的线程ID一致,如果一致,则直接获取到锁,如果不一致,则先去判断一下Mark Word中的偏向锁的标识是否设置成了1(表示当前为偏向锁),如果没有的话,则用CAS去竞争锁,如果竞争成功了,则将对象头里面的ID改成当前线程的ID,如果失败了,就去判断线程是否处于活动状态,如果不处于活动状态,也就是表示已经执行完了同步块里面的内容。则将对象头设置成无锁状态,如果线程还活着,则要么偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,然后唤醒暂停的线程,下面看书里面的一张图应该就好理解的,我倒现在应该看懂了。</p>
<p><img src="/synchronized的实现原理和应用/1.png" alt></p>
<h6 id="轻量级锁"><a href="#轻量级锁" class="headerlink" title="轻量级锁"></a>轻量级锁</h6><p>看了一下书,也在网上找了资料,我的理解是偏向锁和轻量级锁的区别是偏向锁省略了CAS的操作,轻量级锁在竞争锁的时候,会尝试使用自旋来获取锁,当自旋获取锁失败之后,则轻量级锁会膨胀成重量级锁。因为自旋会消耗CPU,为了避免无用的自旋(阻塞时),一旦锁升级到了重量级锁,则就不会在恢复到轻量级锁了,上文也说过了,只会升级,不会降级,当升级到重量级锁时,其他线程只能等待当前线程执行完,释放锁之后才会唤醒其他线程。还是有个图,看看吧</p>
<p><img src="/synchronized的实现原理和应用/2.png" alt></p>
<h5 id="锁的优缺点对比"><a href="#锁的优缺点对比" class="headerlink" title="锁的优缺点对比"></a>锁的优缺点对比</h5><table>
<thead>
<tr>
<th><strong>锁</strong></th>
<th><strong>优点</strong></th>
<th><strong>缺点</strong></th>
<th><strong>使用场景</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>偏向锁</td>
<td>加锁和解锁不需要CAS操作,没有额外的性能消耗,和执行非同步方法相比仅存在纳秒级的差距</td>
<td>如果线程间存在锁竞争,会带来额外的锁撤销的消耗</td>
<td>适用于只有一个线程访问同步快的场景</td>
</tr>
<tr>
<td>轻量级锁</td>
<td>竞争的线程不会阻塞,提高了响应速度</td>
<td>如线程成始终得不到锁竞争的线程,使用自旋会消耗CPU性能</td>
<td>追求响应时间,同步快执行速度非常快</td>
</tr>
<tr>
<td>重量级锁</td>
<td>线程竞争不适用自旋,不会消耗CPU</td>
<td>线程阻塞,响应时间缓慢,在多线程下,频繁的获取释放锁,会带来巨大的性能消耗</td>
<td>追求吞吐量,同步快执行速度较长</td>
</tr>
</tbody>
</table>
<h4 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h4><p>这本书里面的一小部分看完了,也弄懂了,只能说大概的弄懂了,明天去翻翻《深入理解Java虚拟机》这本书里面关于这点是怎么讲的,今天就先到这了,大致了解了一下,有时间再补充。</p>
</div>
<div>
</div>
<div>
<ul class="post-copyright">
<li class="post-copyright-author">
<strong>本文作者: </strong>Congz</li>
<li class="post-copyright-link">
<strong>本文链接:</strong>
<a href="https://Zhucong123.github.io/synchronized的实现原理和应用.html" title="synchronized的实现原理和应用">https://Zhucong123.github.io/synchronized的实现原理和应用.html</a>
</li>
<li class="post-copyright-license">
<strong>版权声明: </strong>本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noopener" target="_blank"><i class="fa fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处!</li>
</ul>
</div>
<div>
<div>
<div style="text-align:center;color: #ccc;font-size:14px;">-------------本文结束<i class="fa fa-heart"></i>感谢您的阅读-------------</div>
</div>
</div>
<footer class="post-footer">
<div class="post-tags">
<a href="/tags/JAVA/" rel="tag"><i class="fa fa-tag"></i> JAVA</a>
<a href="/tags/并发/" rel="tag"><i class="fa fa-tag"></i> 并发</a>
</div>
<div class="post-nav">
<div class="post-nav-next post-nav-item">
<a href="/ArrayList和LinkedList简单讲讲.html" rel="next" title="ArrayList和LinkedList简单讲讲">
<i class="fa fa-chevron-left"></i> ArrayList和LinkedList简单讲讲
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
<a href="/rabbitmq小记.html" rel="prev" title="rabbitmq小记">
rabbitmq小记 <i class="fa fa-chevron-right"></i>
</a>
</div>
</div>
</footer>
</div>
</article>
</div>
</div>
<div class="comments" id="comments">
</div>
</div>
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
文章目录
</li>
<li class="sidebar-nav-overview" data-target="site-overview-wrap">
站点概览
</li>
</ul>
<div class="site-overview-wrap sidebar-panel">
<div class="site-overview">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" src="/images/avatar.gif" alt="Congz">
<p class="site-author-name" itemprop="name">Congz</p>
<div class="site-description motion-element" itemprop="description">平平淡淡,任其自然</div>
</div>
<nav class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">22</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<a href="/categories/">
<span class="site-state-item-count">8</span>
<span class="site-state-item-name">分类</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">23</span>
<span class="site-state-item-name">标签</span>
</a>
</div>
</nav>
<div class="feed-link motion-element">
<a href="/atom.xml" rel="alternate">
<i class="fa fa-rss"></i>
RSS
</a>
</div>
</div>
</div>
<!--noindex-->
<div class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
<div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-4"><a class="nav-link" href="#前言"><span class="nav-number">1.</span> <span class="nav-text">前言</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#好,开始!"><span class="nav-number">2.</span> <span class="nav-text">好,开始!</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#正文"><span class="nav-number">3.</span> <span class="nav-text">正文</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#锁的3种表现形式"><span class="nav-number">3.1.</span> <span class="nav-text">锁的3种表现形式</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#锁的升级和对比"><span class="nav-number">3.2.</span> <span class="nav-text">锁的升级和对比</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#偏向锁"><span class="nav-number">3.2.1.</span> <span class="nav-text">偏向锁</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#轻量级锁"><span class="nav-number">3.2.2.</span> <span class="nav-text">轻量级锁</span></a></li></ol></li><li class="nav-item nav-level-5"><a class="nav-link" href="#锁的优缺点对比"><span class="nav-number">3.3.</span> <span class="nav-text">锁的优缺点对比</span></a></li></ol></li><li class="nav-item nav-level-4"><a class="nav-link" href="#结尾"><span class="nav-number">4.</span> <span class="nav-text">结尾</span></a></li></ol></div>
</div>
</div>
<!--/noindex-->
</div>
</aside>
</div>
</main>
<footer id="footer" class="footer">
<div class="footer-inner">
<div class="copyright">© 2018 – <span itemprop="copyrightYear">2020</span>
<span class="with-love" id="animate">
<i class="fa fa-user"></i>
</span>
<span class="author" itemprop="copyrightHolder">Congz</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-area-chart"></i>
</span>
<span title="站点总字数">138k</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-coffee"></i>
</span>
<span title="站点阅读时长">2:06</span>
</div>
<div class="theme-info">
<div class="powered-by"></div>
<span class="post-count">博客全站共44.8k字</span>
</div>
<div class="busuanzi-count">
<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<span class="post-meta-item-icon">
<i class="fa fa-user"></i>
</span>
<span class="site-uv" title="总访客量">
<span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="site-pv" title="总访问量">
<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
</span>
</div>