并发系列3:Lock锁以及核心类AQS
Java Lock类提供了语言级别的Synchronized,Lock与Condition配合与Synchronized配合object一样实现了等待/通知机制。但它提供了更高的灵活性,有:1尝试非阻塞地获取锁 2获取锁时能响应中断 3超时获取锁。
正文
讲Lock之前,必须先讲讲Java的线程状态以及Synchronized和object如何实现的等待通知机制。
Java线程状态
Java线程状态有以下6种:
1、NEW 初始状态(还没调用start)
2、RUNNABLE 运行状态
3、BLOCKED 阻塞状态
4、WAITING 等待状态
5、TIME_WAITING 超时等待状态
6、TERMNATED 终止状态

Synchronized与object类方法(wait/ notify)配合的流程。
当我们进入Synchronized语块(进入monitor对象)时,如果没能争取到,会进入同步队列,也就是变成阻塞状态。当进入Monitor对象执行完代码退出语块时,它会提醒阻塞状态的线程再次进行争取。
如果在进入Synchronized语块时,使用锁对象的wait()方法,会进入锁对象的等待队列,并释放锁,直到另一个进入语块的对象使用该锁对象的notify()方法,它会唤醒锁对象等待队列下的线程并进入同步队列参与锁的争取。

Lock
详细内容后继补充个,暂时贴上思维导图和AQS源码解析。

AQS源码解析
参考我另一篇博客 https://www.cnblogs.com/llsblog/p/10629784.html
并发系列3:Lock锁以及核心类AQS的更多相关文章
- Java并发指南7:JUC的核心类AQS详解
		一行一行源码分析清楚AbstractQueuedSynchronizer 转自https://www.javadoop.com/post/AbstractQueuedSynchronizer#toc4 ... 
- 并发编程系列之Lock锁可重入性与公平性
		一.相似之处:Lock锁 vs Synchronized 代码块 Lock锁是一种类似于synchronized 同步代码块的线程同步机制.从Java 5开始java.util.concurrent. ... 
- JUC锁:核心类AQS源码详解
		目录 1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱next 2.2 ... 
- 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
		简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ... 
- 【Java并发编程】:并发新特性—Lock锁和条件变量
		简单使用Lock锁 Java5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ... 
- 第44天学习打卡(JUC 线程和进程 并发和并行 Lock锁 生产者和消费者问题 如何判断锁(8锁问题) 集合类不安全)
		什么是JUC 1.java.util工具包 包 分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比Callable相对较低 2.线程和进程 进程:一个程序.QQ.exe, ... 
- 探究UE4网络系列(二)、UE4网络核心类分析
		转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 前面分析了网络核心的基础类Socket/BSDSocket/SocketSubsystem/SocketSubs ... 
- java高并发核心类 AQS(Abstract Queued Synchronizer)抽象队列同步器
		什么是AQS? 全称: Abstract Queued Synchronizer: 抽象队列同步器 是 java.util.concurrent.locks包下的一个抽象类 其编写者: Doug Le ... 
- Java 并发系列之九:java 原子操作类Atomic(13个)
		1. 原子更新基本类型类 2. 原子更新数组 3. 原子更新引用 4. 原子更新属性 5. txt java 原子操作类Atomic 概述 java.util.concurrent.atomic里的原 ... 
随机推荐
- 通过GUID确保winform运行唯一实例
			通过程序生成的GUIDwinform唯一实例 using System.Threading;bool createdNew; Guid ownGUID = new Guid(((GuidAttribu ... 
- APPlication,Session和Cookie的区别
			方法 信息量大小 保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 所有用户 服务器端 Session 小量,简单的数据 用户活动时间+一段延迟时间(一般为20分钟 ... 
- 02bootstrap_通用标签样式和代码
			---恢复内容开始--- 02bootstrap_通用标签样式和代码 1.标题:page-header 副标题样式 2.常用标签和样式 Bootstrap 将全局 font-size 设置为 14px ... 
- linux下设置mysql5.7数据库远程访问
			1.在网上看了很多关于设置远程访问的方式,根本就不起作用,后来在网上看到有一篇文章终于解决了我的问题,在配置文件中 /etc/mysql/my.cnf : 2.编辑 vi /etc/mysql/mys ... 
- MySQL5.7.32 通用版本安装
			1 上传镜像,配置好yum源 2 下载MySQL相关的包 https://dev.mysql.com/downloads/mysql/ 3 解压安装: tar -zxvf mysql-5.7.23- ... 
- 使用Log4net 日志系统
			官方文档 http://logging.apache.org/log4net/release/config-examples.html C# 项目中直接使用nuget,下载Apache的log4net ... 
- jQuery 点击后退(返回)执行函数
			<html> <head> <meta charset="UTF-8"> <meta name="viewport" ... 
- Python switch(多分支选择)的实现
			Python 中没有 switch/case 语法,如果使用 if/elif/else 会出现代码过长.不清晰等问题. 而借助字典就可以实现 switch 的功能 示例: def case1(): # ... 
- java  volatile
			volatile可以保证变量的可见性 当一个变量定义为volatile后,此变量对所有的线程具有可见性.这里的可见性是指当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的. 每次使用v ... 
- Linux whereis命令详解
			Linux whereis命令 Linux whereis命令用于查找文件. 该指令会在特定目录中查找符合条件的文件.这些文件应属于原始代码.二进制文件,或是帮助文件. 该指令只能用于查找二进制文件. ... 
