JUC——线程同步锁(锁处理机制简介)
锁处理机制简介
juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题。
为了解决这样的缺陷,juc里面重新针对于锁的概念进行了设计。
JUC锁机制
JUC锁机制包括以下几个组成部分:
- 核心接口:Lock,ReadWriteLock;
- AQS抽象类:
- AbstractOwnableSynchronizer (排它锁);
- AbstractQueuedSynchronizer (为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架);
- AbstractQueuedLongSynchronizer (64位同步器)
- 工具类:
- Reentrantock互斥锁、ReadWriteLock读写锁、Condition控制队列
- LockSupport阻塞原语、Semaphore信号量、CountDownLatch闭锁
- CyclicBarrier栅栏、Exchanger交换机、CompletableFuture线程回调
之所以在juc里面要重新提供一系列的锁的处理工具类,其根本原因在于,Java原始的锁机制(synchronized)虽然可以提供有数据的安全访问机制,但是其缺点也是非常明显的:所有的线程对象只能享受一把锁。
java.util.concurrent锁概览
- java.util.concurrent.locks提供了锁的基础支持;
- Lock接口:支持语义不同(重入、公平等)的锁规则
- 语义不同,是指锁可是有 “公平机制的锁”、“非公平机制的锁”、“可重入的锁”等等;
- 公平机制:指不同线程获取锁的机制是公平的;
- 非公平机制:指不同线程获取锁的机制是非公平的;
- 可重入的锁:指同一个锁能够被一个线程多次获取,可重入锁最大的作用是避免死锁。
- 语义不同,是指锁可是有 “公平机制的锁”、“非公平机制的锁”、“可重入的锁”等等;
- ReadWriteLock接口和Lock类似的方式定义了一些读取者可以共享而写入独占的锁;
- Condition接口描述了可能会与锁有关的条件变量(与Objec类的wait()方法使用类似)。
公平锁核心概念
- AbstractQueuedSynchronizer:是Java管理 “锁”的抽象类,锁的许多公共方法都是都是在这个类中实现。AbstractQueuedSynchronizer是独占锁(例如,ReentrantLock)。
- AbstractQueuedSynchronizer类别:
- 独占锁:锁在同一个时间点只能被一个线程锁占有。根据锁的获取机制,它有划分为“公平锁”和“非公平锁”。公平锁是按照通过CLH等待线程按照先来先得的规则公平的获取锁;而非公平锁则当线程获取锁时,它会无视CLH等待队列而直接回去锁。
- 共享锁:能被多个线程同时拥有,能被共享的锁。
- CLH队列(Craig,Landin,and Hagersten locks):CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。
- CAS方法(Compare And Swap):比较并交换方法,它是原子操作方法:即,通过CAS操作的数据都是以原子方式进行的。
CLH锁——解决死锁问题
JUC——线程同步锁(锁处理机制简介)的更多相关文章
- Java提高班(三)并发中的线程同步与锁
乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...
- Java并发包——线程同步和锁
Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...
- python笔记10-多线程之线程同步(锁lock)
前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- JUC——线程同步锁(ReentrantReadWriteLock读写锁)
读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...
- JUC——线程同步锁(ReentrantLock)
ReentrantLock简介 ReentrantLock是一个可重复的互斥锁,又被称为独占锁,可重入的意思是:ReentrantLock锁可以被单个线程多次获取.但是在同一个时间点只能被一个线程锁持 ...
- JUC——线程同步锁(LockSupport阻塞原语)
java.util.concurrent.locks.LockSupport这个是一个独立的类,这个类的主要功能是用来解决Thread里面提供的suspend()(挂起线程).resume()(恢复运 ...
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...
- 线程同步——lock锁
线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右: Reentran ...
随机推荐
- 【Step By Step】将Dotnet Core部署到Docker(中)
在Docker中运行MySql MySQL 官方也提供了各种版本的MySQL Image来供用户使用,我们可以使用如下命令来创建并运行一个MySQL Image: docker run -it -p ...
- NodeJS平台下的前后端文件共享
一.前后端文件共享的需要背景——为什么需要共享? 项目基本JS/NodeJS全端开发,有部分代码前后端都需要用得到 有一些配置是在前后端都需要用得到的 区别其他开发平台,NodeJS平台下的前后端文件 ...
- java Activiti6 工作流引擎 websocket 即时聊天 SSM源码 支持手机即时通讯聊天
即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...
- 映射Xml文件中的数据到JavaBean中
使用Java原生的javax.xml.bind包下的JAXBContext将一个Xml文件中的数据映射到一个JavaBean中 import java.io.File; import java.io. ...
- Runtime - ② - NSObject类
首先,我们都知道NSObject是大多数类的根类,但是,这个类的是怎么实现的呢?我们可以去下载开源的Runtime源码,探究下NSObject类的实现. 1. NSObject.h文件 我们可以直接使 ...
- ThinkPHP微信扫码支付接口
最近折腾微信扫码支付,看了微信官方文档,找了很多网页,发现和文档/demo不匹配,现在自己算是弄出来了(文件名称有所更改),贴出来分享一下 一.将有用的官方lib文件和使用的相关文件放置到vendor ...
- Java中 方法的多态 简析图
代码如下: public class Client{ public static void main(String[] args){ Person p = new Person() ...
- File、Paths和Files类的使用详解
Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件. Files:提供了大量处理文件的方法,例如文件复制.读取.写入,获取文件属性.快捷遍历文件目录等..... Fil ...
- Python 基础 Dict 和 Set 类型
python 什么是dict 例如: d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } 我们把名称称为key,对应的成绩称为value,dic就是通过key 来查找 ...
- Linux基础练习题之(四)
Linux基础练习题 请详细总结vim编辑器的使用并完成以下练习题 1.复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的 ...