java中的锁

工作中在遇到并发问题的时候一般通过加上重锁(synchronized, reentrantLock)或者使用cas无锁算法实现,甚至可以通过volietale关键字实现低并发下的安全或者是通过第三方如数据库来实现并发控制。关于java中的锁有很多维度,本文,就java中的锁,整理记录一下。


1 锁的分类和概念

     1.1:公平锁&&非公平锁

                公平锁是指多个线程获得对象锁是按照申请顺序来获得的。非公平锁是指等待线程获得锁并不是按照申请顺序获得的,这种情况加可能会出现饥饿现象,优点是吞吐量稍大。

synchronized:是一种非公平锁,因为他是通过可充入块原语monitorenter  monitorexit实现的,并没有实现aqs所以不能实现公平锁。

ReentrantLock是通过AQS实现线程调度的,在生成ReentrantLock的构造函数中可以指定使用非公平锁还是公平锁。


公平锁指定


       1.2  可重锁&&不可重入锁

可重入锁只是一个概念,就是当这个线程拥有这个锁的时候,这个线程可以再次获得这个锁(这个线程在外层获得了锁在内层还可以再次获得)。synchorized和reentrantLock都是可重入锁,不可重入锁可能会造成死锁。


  1.3 独享锁&&共享锁  

独享锁是指一个锁只能被一个线程所持有,共享锁指一个锁可以被多个线程所持有。Lock类里面的ReadWriteLock里面的读锁是共享锁,写锁是独享锁。   共享锁与独享锁也是通过AQS框架实现的


1.4 乐观锁悲观锁

     乐观悲观也是一种概念。乐观锁:是指面对并发问题时候,总是认为其是不会出现并发冲突的,采取的方式一般是执行后校验,如果校验发现出现了并发冲突,那么进行重试,如果没有发生并发冲突,其实就是没有加锁的。

 悲观锁:不管如何,就是对对象加锁。总是认为这一次操作一定会出现线程冲突。

   一般我们在有可能出现并发问题的地方就必须使用锁,但是当这种并发冲突出现的概率比较低的时候,使用乐观锁的效率会比较高,如果出现冲突的概率比较大,那么使用乐观锁会频繁的重试反而效率会低。

1.4分段锁

    分段锁其实是一种设计方式,不是一种具体的锁。jdk1.7的时候,ConcurrentHashMap就是实现分段锁来实现线程安全的。思路是将一个整体分段。每个段单独拥有一个锁标志,互不影响。也是锁细化的一种思想吧。但是其仍然是一种重量级锁,currentHashMap在jdk1.8的时候就放弃使用分段锁而使用无锁来实现并发安全的了。


1.5 自旋锁 

   自旋锁的概念是当线程需要去获得锁但是没有立即获得的时候,这个时候线程会持续的循环,不放弃cup。这种情况下有两个优点,首先由于是在自旋,其响应时间短 其次,减少了cpu上下文切换的时间。

  缺点:不放弃cpu,如果大量线程自旋,会增大cpu压力,浪费cpu。


 1.6 偏向锁&&轻量级锁&&重量级锁

这是相对于synchronized而言的,锁升级,对象的头字段内有一个字段是锁字段标志,其标志的就是这三个锁状态。

偏向锁是指一段同步代码一直被一个线程访问时候(没有竞争),这个线程就会自动获得锁,降低获得所的代价。当这段同步代码处在偏向锁状态,来了另外一个线程进行访问,这个偏向锁就会升级到轻量级锁,其他线程会通过自旋的方式来等待尝试获得锁,不会等待,提高性能。线程自旋一定程度的时候,就会进入阻塞状态,该锁就会膨胀成为重量级锁(悲观锁)。其他线程进行访问时候就会进入阻塞。





2 java锁优化

1 锁粗化:一般来说我们把锁细化是为了提高效率,但是在某些情况下,比如在循环里面频繁的加锁释放锁,加锁释放锁是需要系统调用cpu用户态到内核态切换的,所以我们要尽量减少加锁释放锁的次数。jvm在运行期间会自动优化,把一些不必要的加锁释放锁的操作合并,扩大锁的作用范围。

2 锁消除:jvm通过逃逸分析发现某些加锁模块根本不会出现线程竞争的可能,虚拟机有可能直接把这个锁去除。

 3锁的膨胀   偏向锁->轻量级锁->重量级锁  这个过程



3 通过java锁相关内容的感悟。

     1 java锁的概念,是我们必须要了解的,了解锁之后正确使用锁才能写出安全的代码。

      2 jvm做的锁优化:jvm层面的锁优化其实是在我们代码的锁使用不合理的情况加采取的一些运行期优化的措施,我们的目的就是不让jvm能够对我们的代码进行优化(让jvm优化说明我们自己写的代码不够优美高效),我们在并发编程的时候,就考虑到锁粗化,不给不会出现并发代码块加锁这些,合理正确使用锁,写出高效率的代码。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • 这是一篇关于java锁的总结的开端,后续会单独对部分锁的原理进行展开。内容大多来自《深入理解Java虚拟机》、《J...
    Eric新之助阅读 874评论 0 3
  • 引自《美团点评团队——不可不说的Java“锁事”》 1.前言 Java中往往按照是否含有某一特性来定义锁,我...
    阿猫阿狗Hakuna阅读 346评论 0 0
  • 理解锁的基本知识 1. 锁的类型 锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁乐观锁是一种乐观思想,即认为读多写少...
    habit_learning阅读 1,481评论 0 9
  • Java是天生的并发语言。多线程在带来更高效率的同时,又带来了数据安全性问题。一般我们将多线程的数据安全性问题分为...
    zhong0316阅读 899评论 0 5
  • 十二月连续上班与周末飞来飞去的参加各种学习,自己感觉异常疲惫,这时候可能机体的免疫系统已经不如平常了。参加完高强度...
    梦云_da4e阅读 610评论 0 1