博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程——锁概念与锁优化
阅读量:6902 次
发布时间:2019-06-27

本文共 1191 字,大约阅读时间需要 3 分钟。

为了性能与使用的场景,Java实现锁的方式有非常多。而关于锁主要的实现包含synchronized关键字AQS框架下的锁,其中的实现都离不开以下的策略。

悲观锁与乐观锁

  • 乐观锁。乐观的想法,认为并发读多写少。每次操作的时候都不上锁,直到更新的时候才通过CAS判断更新。对于AQS框架下的锁,初始就是乐观锁,若CAS失败则转化为悲观锁。
  • 悲观锁。悲观的想法,认为并发写多读少。每次操作数据都上锁,即使别人想读也要先获得锁才能读。对于1.6以前的synchronized关键字,则是悲观锁的实现之一。

CAS无锁算法

全称为 Compare and Swap。CAS有三个操作数,内存值V,旧预期值(已获得的旧数据)A,修改新值B。当且仅当V与A的值相同(compare),才能把V替换为B(Swap)。其中Java中内存值可以通过volatile关键字标识获取,该关键词可以使变量对所有线程实时可见。

CAS算法在锁的应用非常广泛,java中concurrent包的高性能都是基于这个算法,可以说没有CAS,并发包的高性能也就不存在了。

重量级锁

悲观锁的一种。互斥使代码执行可以同步,但这种方式成本比较高,涉及到操作系统的调用阻塞,会造成一些系统资源的浪费。1.6以前,在Java中的即是监视器锁,把.java文件编程成.class文件后能看到synchronized关键字就是通过monitorenter和monitorexit这个两个字节码指令来实现的。

轻量级锁

由于在没有很多线程竞争的前提下,重量级锁会导致性能资源的浪费。每次判断是否无锁,无锁则建锁记录,有锁通过CAS去尝试获取锁(对比Mark Word)。该过程失败会让锁膨胀为重量级锁。

偏向锁

是轻量级锁的优化,适用于无多线程竞争。虽然轻量级锁在可以在较少线程竞争下,减少操作系统调用,减少互斥变量的产生。但在理想情况下,线程很少发生线程竞争,在轻量级锁中,还是会有比较多的CAS操作。在偏向锁中,有一个锁记录(Mark word)标记为偏向,指向当前线程。若该指向不变,则只需要判断记录是否有被切换。如果被切换了,尝试CAS替换指向,后续一直执行同步代码块。当CAS替换指向失败,则说明存在多线程竞争,此时锁会膨胀为轻量级锁。

自旋锁

是锁竞争失败后执行的策略之一,对应的有阻塞的锁。在线程竞争锁失败后,阻塞的锁会把线程阻塞,直到有信号唤起才能继续执行线程,此过程会涉及用户态与系统态的转换,产生性能消耗。而自旋锁在锁竞争失败后,会把线程做自旋,避免线程进入阻塞。在自旋过程中,会不断的尝试去竞争锁。

但如果线程一直自旋都获取不到锁,也会产生很多CPU的性能消耗,所以也有一个自适应的自旋锁(控制自旋的时间)解决这个问题。

转载于:https://blog.51cto.com/14073604/2316719

你可能感兴趣的文章
MSSQL-应用案例-日志表设计优化与实现
查看>>
中国移动应该怎样看待云计算
查看>>
网络安全人才平均月薪近万 这五个城市需求最大
查看>>
云安全风险不再是最令人担心的问题?
查看>>
怎样正确地测试和维护防火墙?
查看>>
打造智能城市 要先撑起一张智能接入的全覆盖大网
查看>>
VMware通过统一端点管理、Windows 10支持与加强身份管理为数字工作空间提供创新...
查看>>
企业信息化“五段论”
查看>>
Verizon报告:2020年IoT平台市场规模将达16亿美元
查看>>
社区的成长才是我们的价值所在 - 阿里云全球第二批 MVP 祁宁专访
查看>>
php在网站根目录下写文件
查看>>
英特尔京东云强强联合 服务互联网+转型升级
查看>>
网络安全靠大家
查看>>
构建生态企业 打造移动化无限可能
查看>>
绝非玩笑!人工智能或开创黑客新时代
查看>>
除了密钥,公有云还有哪些安全保护方式?
查看>>
安全防护重在数据 人才选拔重在心力、脑力、体力
查看>>
SD-WAN提供安全的云服务接入
查看>>
苹果系统被曝漏洞, 大麦网再遭撞库攻击 | 宅客周刊
查看>>
最让程序员感到崩溃的10种编程语言
查看>>