Jdk1.6之后对锁的优化

Jdk1.6之后对锁的优化

偏向锁

偏向锁的意思就是,偏向于第一个获取该资源的锁,如果在接下来的过程中没有其他的线程获取到该锁,那么该获取到锁的线程将不需要获取同步的操作

自旋锁

竞争锁的线程如果没有获取到锁将会被挂起,当持有锁的线程释放掉锁的话将会被唤醒,这样挂起唤醒的操作效率很低,所以出现了自旋锁。自旋锁就是当线程获取锁失败的时候不会被挂起,而是通过执行一个忙循环的操作进行自旋。自旋锁默认是关闭的,可以使用-XX:+UseSpinning参数开启

自适应自旋锁

自旋锁如果是在一个业务逻辑执行比较久的情况下会耗费大量的CPU资源,自适应自旋锁是在自旋锁的基础上,根据上一个在竞争该锁上自旋的时间以及锁的持有者的状态来判断自旋的时间

锁消除

如果一个共享资源并没有发送竞争的情况,那么加在该资源上的锁将会被消除

锁粗化

如果同一个操作频繁对某个对象加锁,那么该锁的范围将会加大

原文地址:https://www.cnblogs.com/lgxblog/p/11569637.html

时间: 2024-10-19 09:04:13

Jdk1.6之后对锁的优化的相关文章

002-多线程-锁-同步锁-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. synchronized结论: 1.java5.0之前,协调线程间对共享对象的访问的机制只有synchronized和volatile,但是内置锁在功能上存在一些局限性,jdk5增加了Lock以及ReentrantLock. 2.java5.0,增加了一种新的机制:显式锁ReentrantLock,注意它

java源码剖析: 对象内存布局、JVM锁以及优化

一.目录 1.启蒙知识预热:CAS原理+JVM对象头内存存储结构 2.JVM中锁优化:锁粗化.锁消除.偏向锁.轻量级锁.自旋锁. 3.总结:偏向锁.轻量级锁,重量级锁的优缺点. 二.启蒙知识预热 开启本文之前先介绍2个概念 2.1.cas操作 为了提高性能,JVM很多操作都依赖CAS实现,一种乐观锁的实现.本文锁优化中用到了CAS,故有必要先分析一下CAS的实现. CAS:Compare and Swap. JNI来完成CPU指令的操作: unsafe.compareAndSwapInt(thi

锁的优化及注意事项

"锁"的竞争必然会导致程序的整体性能下降,以下就是为了降低这种辐作用的建议:     1.减小锁持有时间 如果线程持有锁的时间很长,那么相对地,锁的竞争程度也就越激烈.程序开发应该尽可能地减少对某个锁的占有时间,以减少线程间互斥的可能. public synchronized void syncMethod(){ othercode1(); mutextMethod(); othercode2();} 优化后: public void syncMethod2(){ othercode1

【Java多线程】锁的优化策略

锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1:减少锁持有时间 例如:对一个方法加锁,不如对方法中需要同步的几行代码加锁: 2:减小锁粒度 例如:ConcurrentHashMap采取对segment加锁而不是整个map加锁,提高并发性: 3:锁分离 根据同步操作的性质,把锁划分为的读锁和写锁,读锁之间不互斥,提高了并发性. 4:锁粗化 这看起来与思路1有冲突,其实不然.思路1是针对一个线程中只有个别地方需要同步,所以把锁加在同步的语句上而不是更大的范围,减少线程持有锁的时间: 而

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

不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了 这也是为什么官方建议使用synchronized的原因 毕竟,他是一个关键字啊,这才是亲儿子,Lock,终归差了一点 简单看下,synchronized大致都经过了哪些重要的变革 重量级锁 对于最原始的synchronized关键字,锁被称之为重量级锁 因为底层依赖监

Java性能之synchronized锁的优化

synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现的 2.JDK 1.5,并发包中新增了Lock接口来实现锁功能 提供了与synchronized类似的同步功能,但需要显式获取和释放锁 3. Lock同步锁是基于Java实现的,而synchronized是基于底层操作系统的Mutex Lock实现的 每次获取和释放锁都会带来用户态和内核态的切换,从

锁的优化和注意事项

锁优化分为代码层面的优化和jvm层面的优化 1. 代码层面的锁优化的思路和方法 一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点. 这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差.但是再怎么优化,一般来说性能都会比无锁的情况差一点. ReentrantLock中的tryLock,偏向于一种无锁的方式,因为在tryLock判断时,并不会把自己挂起. 锁优化的思路和方法总结一下,有以下几种. 减少锁持有时间 减小锁粒度 锁分离 锁粗化 锁消除 1.1 减少

JDK1.8中对hashmap的优化

在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑树的实现,当链表的长度大于8时,转换为红黑树的结构. 从上图中可以看出,Java中HashMap采用了链地址法.链地址法,简单来说,就是数组加链表的结合.在每个数组元素上都一个链表结构,当数据被Hash后,得到数组下标,把数据放在对应

锁的优化及注意事项(读书笔记)

有助于提高锁性能的几点建议 减少锁的持有时间 真正需要同步加锁的时候在加锁,减少锁的持有时间有助于减低锁冲突的可能性,进而提升系统的并发能力, 减少颗粒度,所谓减少颗粒度就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提升系统的并发能力,问题在于类似于size()获取全局信息的方法调用并不频繁时,这种减少颗粒度的方法才能真正意义上提高系统吞吐量.(分割数据结构实现) 读写分离锁替换独占锁,读写锁是对系统功能点的分割 ReadWriteLock 在读多写少的场合,读写锁对系统性能是很有好吃的