JUC--ReetrantLock原理及源码分析(一)之相关概念

互斥锁/共享锁重入锁阻塞队列临界点 -> 插队现象公平锁/非公平锁interrupt 传递CAS(Compare And Swap)比较和交换可见性 volatile原子性 cas()操作有序性 缓存锁(MESI),总线锁
摘要由CSDN通过智能技术生成

JUC–ReetrantLock原理及源码分析(一)之相关概念

ReentrantLock的依赖/继承关系图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201212153529130.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTcyNTc5Mg==,size_16,color_FFFFFF,t_7

相关概念:

互斥锁(排它锁)/共享锁
互斥锁:同一把锁只能一个线程持有。
共享锁:同一把锁可多个线程同时持有。

重入锁
线程中a方法调用b方法,因为是同一把锁,可直接获取, lock一次参数state + 1

public void a() {
    lock.lock();
    b();
    lock.unlock();
}
public void b() {
    lock.lock();
    ...
    lock.unlock();
}

AQS
AbstractQueuedSynchronizer
阻塞队列
AbstractQueuedSynchronizer#Node -> AQS维护的一个双向队列
公平锁/非公平锁

通过ReentrantLock构造函数分析得出,默认为非公平锁。
有参构造传递true则为公平锁。
区别:

  • 公平锁:并发环境中,线程直接进入等待队列。
  • 非公平锁:并发环境中,线程首先获取锁,获取不到再进入等待队列。

    出现临界点 -> 插队现象 :5个线程抢占锁,四个线程会等待,这时1线程执行完,刚刚释放锁,6线程进来了,插队抢占锁。

public ReentrantLock() {
      sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
       sync = fair ? new FairSync() : new NonfairSync();
}

interrupt 传递

// 外部调用线程的interrupted方法  休眠中的线程可以感知并且继续抢占锁,同时将interrupted参数向上传递
Thread.interrupted();

// 这个场景中会有用   假设interrupted不能够上传,这段代码永远不会结束
new Thread(new Runnable() {
   @Override
    public void run() {
        lock.lock();
        while (!Thread.currentThread().isInterrupted()) {
        }
        lock.unlock();
    }
}).start();

在这里插入图片描述

CAS(Compare And Swap)比较和交换

  • 可见性 volatile
  • 原子性 cas()操作
  • 有序性 缓存锁(MESI),总线锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值