java轻量级锁、重量级锁、可重入锁、偏向锁、自旋锁的概念
1、重量级锁
作为互斥同步的方式,是最基础的锁,其他的锁都是为了减少开销做的优化,重量级锁借助了monitor 对象,monitor对象中有三个区域,分别是entity site、 owner和wait,进程进入同步前首先进入entity区域等待,若owner没有进程,则进入owner区域,若owner区域已经有进程则阻塞等待,owner也可以执行wait进入wait区域,当owner区域的进程执行完毕释放锁后,会唤醒阻塞的进程竞争锁,由于会导致线程的阻塞,则势必会导致用户态到核心态的切换,大大增加了损耗,因此才称为重量级锁。
2、自旋锁
自旋锁就是为了防止线程阻塞所带来的上下文切换损耗,当线程竞争锁失败后,并不阻塞,而是继续请求锁直到锁释放,一般虚拟机设置为10次,可以自己设置,现在虚拟机也可以根据对象使用动态设置,当然自旋过程中也需要占用cpu,因此只使用于多核心的情况下,类似于等红灯的时候不熄火等绿灯。
3、轻量级锁
轻量级锁是在线程没有其他竞争者的情况下的操作,先说一下对象头的构造,对象头的一部分存储的是与对象自身信息无关的信息,被称为markword,包括自身hash码、gc分代年龄等,mark word的32个比特里25个比特存哈希码,4个存分代年龄,2个存锁标记,1个存是否进入偏向锁,当对象被加了轻量级锁后,markword就被拷贝到当前线程,并被替换成指向位置的指针,替换过程要采用CAS操作,如果更新失败则说明有线程在竞争当前对象,锁膨胀成为重量级锁,在解锁时同样要进行CAS操作进行修改,如果失败则说明当前锁已经进入重量级锁,要唤醒等待进程,假如进程A持有当前锁对象,而此时进程B试图获取,则B会将锁修改为重量级锁,虚拟机会建立monitor对象,B进入阻塞或者自旋。
4、偏向锁
偏向锁和轻量级锁一样,都是基于当前进程没有其他进程竞争锁对象时,偏向锁更加乐观,当确定当前锁对象的mark word指向的是自身的指针后,则不进行CAS操作,直接继续使用对象,除非有其他进程竞争才膨胀为重量级锁。
5、可重入锁
当前进程在获取锁对象后,第二次获取对象时若持有锁对象的是自身,则可以继续使用
在锁优化中,若无其他线程竞争锁对象,当有使用到当前锁对象的hashcode时,也会导致锁膨胀
java轻量级锁、重量级锁、可重入锁、偏向锁、自旋锁的概念的更多相关文章
- Java锁的深度化--重入锁、读写锁、乐观锁、悲观锁
Java锁 锁一般来说用作资源控制,限制资源访问,防止在并发环境下造成数据错误 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 Reentr ...
- Java并发-显式锁篇【可重入锁+读写锁】
作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized: 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock.读写 ...
- 【Java面试】什么是可重入,什么是可重入锁? 它用来解决什么问题?
一个工作了3年的粉丝,去一个互联网公司面试,结果被面试官怼了. 面试官说:"这么简单的问题你都不知道? 没法聊了,回去等通知吧". 这个问题是: "什么是可重入锁,以及它 ...
- Java多线程:synchronized的可重入性
从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...
- Java锁的种类以及辨析(二):自旋锁的其他种类
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
- Java并发(九):重入锁 ReentrantLock
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...
- 浅谈Java中的锁:Synchronized、重入锁、读写锁
Java开发必须要掌握的知识点就包括如何使用锁在多线程的环境下控制对资源的访问限制 ◆ Synchronized ◆ 首先我们来看一段简单的代码: 12345678910111213141516171 ...
- Redis分布式锁—Redisson+RLock可重入锁实现篇
前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...
- 【java并发编程】ReentrantLock 可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...
- java锁的种类以及辨析(一):自旋锁
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
随机推荐
- 制作 2D 素材|基于 AI 5 天创建一个农场游戏,第 4 天
欢迎使用 AI 进行游戏开发! 在本系列中,我们将使用 AI 工具在 5 天内创建一个功能完备的农场游戏.到本系列结束时,您将了解到如何将多种 AI 工具整合到游戏开发流程中.本系列文章将向您展示如何 ...
- 【DS】1.1
1.概念: 数据项:最小单位 数据对象:相同性质的数据元素集合 数据结构:关系 集合 同样的数据元素可组成不同的数据结构不同数据元素也可以组成相同的数据结构 2.三要素: 逻辑结构:集合(不考)线性结 ...
- jdbc访问KingbaseES数据库SocketTimeoutException Read timed out
jdbc访问KingbaseES数据库发生异常:SocketTimeoutException Read timed out 一.异常现象: 应用显示ERROR信息: Caused By: java.n ...
- Vue3 企业级优雅实战 - 组件库框架 - 12 发布开源组件库
前面使用了 11 篇文章分享基于 vue3 .Monorepo 的组件库工程完整四件套(组件库.文档.example.cli)的开发.构建及组件库的发布.本文属于这 11 篇文章的扩展 -- 如何发布 ...
- UOJ NOI Round #6
总结 \(\text{Day1}\) 只打了 \(T1\),想正解无果以致于没时间打暴力 \(\text{T1}\) 考虑到最后一个面基者要么落在点上,要么落在边上 所以可以枚举点和边,统计最久的落在 ...
- PostGIS之几何创建函数
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...
- Postgresql如何防止数据库雪崩
一.背景 在数据库的使用过程中,一些微妙的操作,在特殊的场景中就可能导致雪崩效应. 1. 当数据库中存在未提交事务,并且未提交事务已经持有了某个表的哪怕是最小的锁时,如果此时对这个对象发起DDL操作, ...
- CPU L1,L2,L3多级缓存的基本作用
基本作用 加快CPU与主内存之间的数据交换. 区别 缓存类型 L1 L2 L3 位置 最靠近CPU核心 次之 再次之 容量 一般几十KB~几百KB 几百KB~几MB 几MB~几十MB 速度 几个时钟周 ...
- 关于vue组件传值和事件绑定问题
<template> <view style="width: 100%; height: 100%;"> <view class="tabs ...
- UVM——callback机制应用示例
对应代码: 1.在UVM组件中主操作函数或者任务之前或者之后内嵌callback函数或任务 1 class driver extends uvm_driver #(transaction); 2 `u ...