网站首页 > java教程 正文
1、锁的本质是什么?
锁的使用者是谁?
进程还是线程,锁的使用者是线程。
进程是资源分配的最小单位,独占资源,不同进程之间是隔离的,无需使用锁。
线程是CPU调度的最小单位,共享进程的资源的,存在临界资源竞争的情况,根据需要使用锁。
锁的是什么?
临界资源,也称共享资源,一次只允许一个线程访问,可以是某段代码,可以是某个函数。
锁的作用域,可以作用于类,也可以作用于对象。
锁的本质
锁保证线程对临界资源的有序访问,都是在内存中实现的。
2、现实世界的映射(类比游戏)
把锁想象一个足球游戏(自己定义的规则:每个人抢到球玩5分钟,到时间可以抢球,也可以排队),有11个球员(11个线程),1个足球(临界资源)。
3、锁的升级(针对synchronized锁)
4、AQS是什么?
AQS是类AbstractQueuedSynchronizer的首字母缩写,从类名上,见名知意,包含三个关键字:抽象、队列、同步器,抽象说明实现了某些方法,还需要子类实现自己的方法或重新父类的方法;队列使用了队列这种数据结构;同步器是指要解决线程同步的问题,提供同步解决基础类。
AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。
AbstractQueuedSynchronizer分析
1、同步状态:0代表未有线程占锁,大于0代表有线程占有,大于1代表线程重入,volatile关键字保证可见性。
private volatile int state;
2、head:等待队列头节点,延迟初始化。
private transient volatile Node head;
3、tail:等待队列尾节点,延迟初始化,只能通过enq方法来添加新的等待节点。
private transient volatile Node tail;
4、Node子类
static final class Node {
/** 节点正在共享模式中等待 */
static final Node SHARED = new Node();
/** 节点正在独享模式中等待 */
static final Node EXCLUSIVE = null;
/** 线程已取消 */
static final int CANCELLED = 1;
/** 节点的状态为SIGNAL时,表示它的后继节点正阻塞或即将阻塞(后继节点在阻塞之前会先去设置它的状态为SIGNAL) */
static final int SIGNAL = -1;
/** 节点处于条件队列中,条件队列中使用的状态,节点在某条件下从条件队列转换到同步队列 */
static final int CONDITION = -2;
/**
* 用于共享模式的状态,表示需要向后传播唤醒
*/
static final int PROPAGATE = -3;
/**
* 同步状态,只能是如下取值:
* SIGNAL: 这个节点的后继节点被阻塞(或将很快被阻塞),因此当前节点在释放或取消后继节点时必须解除它的阻塞。为了避免竞争,acquire方法必须首先表明它们需要一个信号,然后重试原子的acquire,如果失败,则阻塞。
* CANCELLED: 由于超时或中断,该节点将被取消。节点永远不会离开这种状态。特别是,取消节点的线程永远不会再阻塞。
* CONDITION: 该节点当前位于条件队列上。在传输之前,它不会被用作同步队列节点,此时状态将设置为0。
* PROPAGATE:
* 0: 其他情况
*/
volatile int waitStatus;
/**
* 前驱节点
*/
volatile Node prev;
/**
* 后继节点
*/
volatile Node next;
/**
* 此节点的线程
*/
volatile Thread thread;
/**
* 下一个condition队列等待节点
*/
Node nextWaiter;
}
基于AQS的锁:
- ReentrantLock
- ReentrantReadWriteLock
- CountDownLatch
- CyclicBarrier
- Semaphore
- AQS中依赖sun.misc.Unsafe
5、synchronized
- 上一篇: Java锁的理解(java锁的概念)
- 下一篇: Java中的各种锁(java锁的用法)
猜你喜欢
- 2024-10-05 Java并发锁:偏向锁、轻量级锁、重量级锁详解
- 2024-10-05 Java 中的锁原理、锁优化、CAS、AQS 详解
- 2024-10-05 打通 JAVA 与内核系列之 一 ReentrantLock 锁的实现原理
- 2024-10-05 JAVA中锁的深入理解与解析(java中锁的种类)
- 2024-10-05 Java中的各种锁(java锁的用法)
- 2024-10-05 你不知道的java的锁机制(java锁机制详细讲解)
- 2024-10-05 Java锁的理解(java锁的概念)
- 2024-10-05 简单了解下Java中锁的概念和原理(java锁的用法)
- 2024-10-05 一文搞懂 JAVA 主流锁设计(java锁是什么)
- 2024-10-05 面试官问:Java 中的锁有哪些?我跪了……
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)