网站首页 > 精选教程 正文
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
猜你喜欢
- 2024-11-21 Java中的重重“锁”事
- 2024-11-21 线程进阶:多任务处理——Java中的锁(Unsafe基础)
- 2024-11-21 深入理解MySQL锁机制原理
- 2024-11-21 Java并发锁的原理,你所不知道的Java“锁”事
- 2024-11-21 阿里二面:你知道Java中的同步与锁机制详解?
- 2024-11-21 图解Java中的锁:什么是死锁?怎么排查死锁?怎么避免死锁?
- 2024-11-21 Java锁与线程的那些“不可描述”的事儿
- 2024-11-21 让人闻风丧胆的 Mysql 锁机制
- 2024-11-21 Java中各种锁的理解
- 2024-11-21 JAVA中有哪些锁?各种锁的实现方式?程序员面试如何回答?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)