JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

知识点深度解读系列-JAVA锁

wys521 2024-11-21 22:24:20 精选教程 40 ℃ 0 评论

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表