偏向锁:

首先了解对象头MARK指针(对象头标记,32位):

存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID)

大部分情况是没有竞争的,所以可以通过偏向来提高性能

所谓的偏向,即锁会偏向于当前已经占有锁的线程 ,通过将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark 只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步 ,当其他线程请求相同的锁时,偏向模式结束 -XX:+UseBiasedLocking 默认启用 在竞争激烈的场合,偏向锁会增加系统负担

轻量级锁:

普通的锁,性能方面不是很理想,轻量级锁是一种快速的锁定方法,

如果对象没有被锁定 ,将对象头Mark指针保存到锁对象中, 将对象头设置为指向锁的指针(在栈空间中),

如果轻量级锁失败,表示存在竞争,升级为重量级锁(常规锁)

优势:

减少OS互斥量(传统锁)产生的性能损耗

缺点:

在竞争激烈时,轻量级锁会多做很多额外操作,导致性能下降

自旋锁:

(1)线程竞争通常存在(2)锁持有时间较短,也就是同步快较短

可以使用自选锁(spinning lock)

当竞争存在时,如果线程可以很快获得锁,那么可以不在OS层挂起线程,让线程做几个空操作(自旋),自旋感觉就像是轮询,如果自旋成功,可以节省线程挂机,切换时间,提升系统性能,相反,如果同步快很长,自旋失败,会降低系统性能。

总结:

这三种锁不是Java方面的锁优化方法

内置于JVM中锁的优化方案:

偏向锁可用,则偏向锁或轻量级锁可用则轻量级锁---->若都失败,则尝试自旋锁----->自旋锁失败,会尝试普通锁(使用OS互斥量在操作系统层挂起)

锁的优化:

减少锁的持有时间

锁分离(可以按功能划分,只要操作互不影响,锁就可以分离,)

减小锁粒度,提高并行成都

锁粗化(凡事都有一个度,如果对同一个锁不停的进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化,eg:合并锁)


concurentHashMap 通过对大数组进行分段,用多个小数组来维护一个hashMap,每当一个线程
操作hashMap时,只对他自身的一个小数组加锁(普通的hashMap是通过对超大数组直接加锁),而其他线程可以操作这个hashMap的其他小数组,不用等待;原理就是,减小锁力度,提高并行程度

除了通过减小锁力度,还可以通过根据功能不同进行锁分离:比如读写锁:读多写少的情况,可以提高性能,也就是读读的情况下,多线程可以直接访问,写写,读写进行锁等待

读写锁怎么实现:当线程A去写的话,判断读锁有没有被占用,有的话,等待,没有的话,开始写入,上写锁;当线程B去读,先判断写锁有没有被占用,有的话,等待,没有的话,开始读,上读锁---------------------延伸一下,读是一个功能,写是一个功能。
读写锁分离思想延申:即只要操作互不影响,锁就可以分离,取元素和读元素两个操作互不影响
LinkedBlockIngQunue:take/put,内部一把tak锁,一把put锁,当take的时候,加take锁,put的时候加put锁,但是多个线程,可以同时take,put。

所有的主动加锁,都是悲观锁,
无锁:乐观锁,cas原理,传入新值,期待值;内部旧值和期待值相比,比如数据库(直接内存)期待一个值为x,旧值如果等于x,那么将新值设入。

锁粗化:初衷是为了提高并行程度,减小锁粒度,但是频繁的请求,同步,释放,持有锁时间较短,造成系统频繁切换,增加额外消耗,违背初衷,此时使用锁粗化:

jvm层面锁优化+一般锁的优化策略的更多相关文章

  1. jvm(13)-线程安全与锁优化(转)

    0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 ...

  2. jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)

    JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...

  3. jvm(13)-线程安全与锁优化

    [0]README 0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概 ...

  4. 深入理解JVM(7)——线程安全和锁优化

    Java中的线程安全 按照线程安全的“安全程度”由强至弱来排序,可以将Java语中各种操作共享的数据分为以下5类:不可变. 绝对线程安全. 相对线程安全. 线程兼容和线程对立. 1.不可变 不变的对象 ...

  5. JVM(8) 线程安全与锁优化

    面向过程编程:程序编写以算法为核心,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间的客体,程序代码则用于处理这些数据.这种思维方式直接站在计算机的角度去抽象问题和解决问题,称为面向过程 ...

  6. JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt364 本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同 ...

  7. 深入理解JVM(③)Java的锁优化

    前言 从JDK5到JDK6HotSpot虚拟机开发团队花费了大量的资源实现了各种锁优化技术,如适应性自旋(Adaptive Spinning).锁消除(Lock Elimination).锁膨胀(Lo ...

  8. Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...

  9. JIT对锁的优化- 锁消除和锁粗化案例分析

    锁消除和锁粗化案例分析 锁消除 直接上代码 /** * 描述: 锁粒度演示 * @author karl * @create 2020-02-11 14:38 */ public class MySy ...

随机推荐

  1. Integer 原码解读

    有一天,突然发现,阅读原码可以发现很多有趣的东西.在Java中,我们知道很多东西都是封装好的,拿来即用,当你有一天去研究它拿来的东西是如何具体操作的,将会是非常有趣的事情. 在上一篇研究HashMap ...

  2. day27 异常处理 和 网络协议

    元类补充 class MyMeta(type): # 用于新建类对象 def __new__(cls,*args,**kwargs) print(MyMeta) print(*args) # 调用ty ...

  3. 【Scheme】符号求导

    思路: 定义一个求导算法, 令其在抽象对象上执行求导操作. 可以由以下规约规则完成: dc/dx=0 dx/dx=1 d(u+v)/dx=du/dx+dv/dx d(uv)/dx=u(dv/dx)+v ...

  4. 2019年华南理工大学程序设计竞赛(春季赛)-C-六学家的困惑

    题目链接:https://ac.nowcoder.com/acm/contest/625/C 题意:给定两个字符串,每次只能从两个字符串的两端取字符,求依次取字符后所构成的数字最大为多少. 思路:思路 ...

  5. GIRDVIEW 控件绑定数据后 后台c#控制隐藏某列

    gv_EnterpriseInfo.DataSource = pageResult.Data; gv_EnterpriseInfo.DataBind(); 之后加判断条件: if (true) { g ...

  6. WLC5520无法通过无线客户端进行网管故障解决

    客户反馈其办公环境中的WLC5520网管需要通过内部有线网络进行管理,通过无线客户端无法进行管理,远程协助其开启WLC5520的无线管理功能后故障解决.

  7. vue使用日期时间插件layDate

    项目中需要用到日期时间插件,尝试用bootstrap.element的时间插件都各有各的报错,对于一个菜鸟来说真的是很痛苦啊.终于,最后用了layDate实现了需要的功能 最终效果: 使用步骤: 1. ...

  8. TOJ 2778 数据结构练习题――分油问题(广搜和哈希)

    描述 设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油.初始时,第一个油桶盛满油,第二.三个油桶为空,在某一个油桶上分出targ公升油. 输入 输入包含多组测试数据.每组数据包含一行.分别x ...

  9. 用户管理系统之class

    接着上一篇博客继续往下总结,上一篇博客的地址:https://www.cnblogs.com/bainianminguo/p/9189324.html 我们开始吧 这里我们就需要先看下我们设计的数据库 ...

  10. Struts2把数据封装到集合中之封装到Collection中

    数据封装到集合中,可以封装到集合中,也可以封装到Map中.该篇博客主要讲解数据封装到集合中的封装到Collection中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) ...