文章目录
- 1. ReentrantLock 可重入锁
- 2. 不可重复锁,需要自定义
- 3. 悲观锁:对数据上锁,其他线程拿不到锁,就不能阻塞了
- 4. 乐观锁
- 5. 独占锁(排他锁)
- 6. 共享锁
- 7. 互斥锁
- 8. ReentrantReadWriteLock 读写锁
- 9. 公平锁
- 10. 非公平锁
- 11. 自旋锁
- 12. 分段锁
- 13.锁升级
- 14. 锁粗化
- 15. 锁清除
1. ReentrantLock 可重入锁
可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁
synchronized和ReentrantLock都是可重入锁
Lock lock = new ReentrantLock);
lock.lock);
lock.unlock);
2. 不可重复锁,需要自定义
package com.xin.demo.threaddemo;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class LockDemo2UnReentrantLock {public static void mainString[] args) {MyLock lock = new MyLock);lock.lock);try {System.out.println"第一次获取锁");lock.lock);try {System.out.println"第二次获取锁");} finally {lock.unlock);}} finally {lock.unlock);}}
}class MyLock implements Lock {//绑定线程private Thread thread;@Overridepublic void lock) {synchronized this) {while thread != null) {try {wait);} catch InterruptedException e) {e.printStackTrace);}}this.thread = Thread.currentThread);}}@Overridepublic void lockInterruptibly) throws InterruptedException {}@Overridepublic boolean tryLock) {return false;}@Overridepublic boolean tryLocklong l, TimeUnit timeUnit) throws InterruptedException {return false;}@Overridepublic void unlock) {synchronized this) {if thread != Thread.currentThread)) {return;}thread = null;notifyAll);}}@Overridepublic Condition newCondition) {return null;}
}
3. 悲观锁:对数据上锁,其他线程拿不到锁,就不能阻塞了
synchronized RetrantLock HashTable 都是悲观锁
4. 乐观锁
加字段version
5. 独占锁(排他锁)
一个线程对共享数据上锁后,其他线程就不能对读共享数据加任何类型的锁,synchronized和lock的实现都是独占锁
ReentrantReadWriteLock.writeLock)是独占锁
ReentrantReadWriteLock lock = new ReentrantReadWriteLock);
ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock);
writeLock.lock);
writeLock.unlock);
6. 共享锁
多个线程同时对共享数据加锁,且对共享数据加的锁只能都是共享锁,不能是独占锁,共享锁只能读数据,不能修改数据
ReentrantReadWriteLock.readLock)是共享锁
ReentrantReadWriteLock lock = new ReentrantReadWriteLock);
ReentrantReadWriteLock.ReadLock readLock = lock.readLock);
readLock.lock);
readLock.unlock);
读锁->写锁:锁升级
写锁->读锁:锁降级
7. 互斥锁
互斥锁是独占锁的一种常规实现,读读、读写、写写都是互斥的
8. ReentrantReadWriteLock 读写锁
写线程独占写锁,读线程共享读锁,允许一个写锁和多个读锁共存
9. 公平锁
公平锁按照线程申请锁的顺序来获取锁
ReentrantLock reentrantLock = new ReentrantLocktrue);
public ReentrantLockboolean fair) {sync = fair ? new FairSync) : new NonfairSync);}
10. 非公平锁
不是按照线程申请的顺序来获取锁,可能造成优先级翻转
synchronized 是非公平锁,ReentrantLock默认也是非公平锁
11. 自旋锁
- 线程没有获得锁的情况下,不是直接挂起,而是进行忙循环,这个忙循环就是自旋
- 自适应自旋:即自旋自适应,以为不可能让线程一直自旋,需要一个自旋的时间,这个时候就可以根据上一次自旋的时间来决定这次自旋的时间。
- 自旋是为了有效防止线程做状态的转换,因为线程挂起和唤醒也很消耗性能,AtomicInteger中就有自旋的操作
12. 分段锁
对锁的粒度进一步优化,操作数组时不是对整个数组加锁,仅仅针对其中的一项加锁
ConcurrentHashMap就使用了分段锁
13.锁升级
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁,根据所线程的竞争情况逐渐升级,synchronized就有锁升级的过程
偏向锁:锁偏向于第一个获取锁的线程
轻量级锁:线程会自旋
重量级锁:排他锁,其他线程直接阻塞
14. 锁粗化
多次上锁解锁的请求合并为一次
15. 锁清除
没有竞争的锁,直接清除
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2201329.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
锁简单介绍
文章目录1. ReentrantLock 可重入锁2. 不可重复锁,需要自定义3. 悲观锁:对数据上锁,其他线程拿不到锁,就不能阻塞了4. 乐观锁5. 独占锁(排他锁)6. 共享锁7. 互斥锁8. ReentrantReadWriteLock 读写锁9. 公平……
STC单片机对DS1302数据读写
STC单片机对DS1302数据读写 🌿实验对象:STC12C5A60S2 🌿晶振频率:11.059MHz 🌿串口波特率:9600 🔖使用第三方库函数,基于硬件I2C实现。 📜串口打印读取信息: ✨如果程序需要适配到STC其他系列单片机上,需要重新配置串口输出相关代码。 📑引脚定义 🔖如更换……
Hibernate多表关联——(一对多关系)
Hibernate多表关联——(一对多关系) 文章目录Hibernate多表关联——(一对多关系)1.分别在类中添加属性:2.hibernate建表3.使用测试类在表中添加数据hibernate是连接数据库使得更容易操作数据库数据的一个框架ÿ……
SPI通讯的数据交互及图片显示
这个项目耗时三个月,前两个月攻克技术难关,后一个月进行功能联调,也是我很长时间没有更新的原因。一个项目从初期的evt到最终的pvt,离不开大家的合作。从前期的prd核对到最终的项目交付,耗费了我大量心血,期……
最新JVM技术:基于Springboot 3 对GraalVM Native Image进行构建、部署测试
本文基于Springboot 3 对GraalVM Native Image进行构建、部署测试
注意: 由于native-image不支持交叉编译【即在windows OS上产生的native-image 不能在其它操作系统如Linux OS上使用】,你可以保留一个与操作系统无关的部署工件,稍后将其转换为不同的操作系统架构。 As nat……
springboot中配置拦截器及使用
文章目录1、什么是拦截器2、自定义拦截器(Interceptor)3、运用在项目中(springboot)1、什么是拦截器
SpringMVC拦截器(Interceptor)可实现对每一个请求处理前后进行相关的业务处理,类似于servl……
Unity 基于Jenkins自动化打包流程
什么是Jenkins? Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins的下载与安卓
直接搜索jenkins进入官网下在LTS……
Optional(优雅的解决空指针)
文章目录一、介绍二、构建三、API1、包装的对象是否为null2、返回包装对象3、包装的对象不为null进行的操作,否则不做任何操作4、过滤包装对象5、包装对象数据转换四、例子1、获取嵌套的对象的属性值2、值不为null进行的操作3、必须返回一个固定的对象4、!null则拆分……
数据结构之第四章、ArrayList和顺序表
一、线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是……
P1017 [NOIP2000 提高组] 进制转换
题目描述
我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 1010 为底数的幂之和的形式。例如 123123 可表示为 110221013100110221013100 这样的形式。
与之相似的,对二进制数来说,也可表示成每个二进制数……
Pandas入门实践2 -数据处理
为了准备数据进行分析,我们需要执行数据处理。在本节中,我们将学习如何清理和重新格式化数据(例如,重命名列和修复数据类型不匹配)、对其进行重构/整形,以及对其进行丰富(例如,离散化……
一、lua基础知识1
一、lua 的数据类型
–类型 a1; –number printtypea)) –number b"HelloWorld"; printtypeb)) –string 两种数据类型 ctrue; printtypec)) –boolean true 或者 false d print; d"HelloWorld"); printtyped)); –function类型 ……
二、lua语言基础2
1.lua的类型有哪些?答:lua的数据类型有:number,string,nil function,table,thread,userdata用户自定义的类型),boolean(布尔类型) 2.什么是尾调用,尾调用有什么优点尾调用:在一个函数的最后一步开始调用另……
quick-cocos2dx-luaUI控件讲解
–MyApp部分 require"config") require"cocos.init") require"framework.init") local MyApp class"MyApp", cc.mvc.AppBase) function MyApp:ctor) MyApp.super.ctorself) end function MyApp:run) cc.FileUti……
quick-cocos2dx lua语言讲解 动作,定时器,触摸事件,工程的类的讲解)
–MainScene部分
— display.newScene 创建一个场景 — 在quick里面我们的控件、精灵 一般是加载到场景上的 local MainScene class"MainScene", function) return display.newScene"MainScene") end) function MainScene:ctor) –创……
使用quick-cocos2dx-lua 实现的小游戏(包含碰撞检测,触屏发子弹)
–主界面local MainScene class"MainScene", function)return display.newScene"MainScene")end)ON true;function MainScene:ctor)local bg cc.Sprite:create"main_background.png");bg:setScale2);bg:setPositiondisplay.cx,display……
cocos2d-js 中scrollview详解
/****
开头的一些废话:
1、多思考,善于思考
2、懂得变通
3、多多查询API首先复制一段 API中的源码:(UIScrollView.js)这段代码可以看出 scrollview
中的容器是一个node,并且他的位置是:代码最后……
cocos2d-js中的回调函数中世界坐标系和节点坐标系的相互转换
世界坐标系和节点坐标系都是OPENGL 坐标系 1、世界坐标系原点就是屏幕的左下角; 2、节点坐标系的原点就是一个节点的左下角; 3、两个坐标系可以通过已经写好的cocosAPI进行想换转换; 4、所有的节点需要转为一个节点上或者是统一的世界坐标系……
通过JavaScript实现漂浮
<html>
<head><meta http-equiv"Content-Type" content"text/html"; charset"gb2312" /><title>漂浮广告</title><style type"text/css">div{position:absolute;}</style>
</head>
&……
序列动画和图片内存问题
一、帧动画问题 /*** 帧动画总结:* 1、如果精灵进行新建时,加载了纹理,那么setRestoreOriginalFrame可以设置为false或者true* 2、如果精灵新建时,没有加载纹理的话,那么setRestoreOriginalFrame需要设置为false&#……
编程日记2023/4/16 15:01:22