自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 开源项目前导 剖析Redisson源码tryLock() 整体流程技术图(3)

剖析Redisson源码tryLock() 整体流程技术图

2024-07-06 15:22:07 142

原创 开源项目前导 剖析Redisson源码tryLock() 看门狗续期(2)

如果是重入,那么putIfAbsent函数就不会执行,返回值就是之前旧的ExpirationEntry类,也就是第一次进来创建的ExpirationEntry类。这样,如果是第一次进入的时候,这里放进去的就是一个全新的ExpirationEntry类,也就是当前锁,返回值就是null。如果获取锁返回的锁key的剩余有效期的时间为null的时候(也就是获取锁成功),就会解决最长等待剩余有效期的问题。tryAcquireAsync方法就是上面解读Redission的可重入锁的源码调用到的一个方法。

2024-07-02 07:56:07 925

原创 深入理解 JUC 的 线程池 excute() 方法 (3)

CPU 利用阻塞状态不占用 CPU 资源,线程被挂起,等待条件满足或资源可用。睡眠状态会占用一部分 CPU 资源,操作系统会为线程分配时间片,但线程不会参与任务调度。2.状态转换阻塞状态由条件触发,可以通过唤醒条件或资源释放结束阻塞。睡眠状态由线程调用 Thread.sleep() 方法触发,时间结束或被中断(InterruptedException)时结束睡眠。3.用途阻塞状态常用于等待共享资源或外部条件变化。睡眠状态常用于暂停执行一段时间,实现定时操作或控制程序流程。

2024-07-01 06:58:54 999

原创 开源项目前导 剖析Redisson源码tryLock()(1)

学习的话 建议自己边看源码 边跟着我的思路走。

2024-06-30 07:55:16 618

原创 开源项目前导 Redisson是什么?

在执行业务的时候再次获取该锁,首先也是判断锁是否存在,很明显,锁已经存在了,那么判断锁的标识是否是当前线程的(也就是判断这把锁是不是自己持有了),如果否,证明锁是被其他线程占有,获取锁失败。如果是,需要可重入,则重入次数+1,并重置锁的有效期,执行相应业务。这里的业务执行完毕之后,首先判断锁是否是自己的(防止线程阻塞导致锁过期,因而释放掉其他线程的锁,也就是防止锁误删情况),如果是,那么锁的重入次数-1,接着判断锁的重入次数是否为0,如果为0,证明是已经到了最外层,就可以把锁释放掉了。

2024-06-30 07:14:20 824

原创 深入理解 JUC 的 线程池 工作的原理和内部的构造

ctl 通过原子操作确保对线程池状态和线程数量的更新是线程安全的。例如,增加或减少工作线程数时,可以通过 AtomicInteger 提供的原子方法(如 incrementAndGet、decrementAndGet 等)进行操作,而不需要使用额外的锁机制。以上是 JDK 提供的一些拒绝策略,这四个用的比较多的是第一种 AbortPolicy,也是默认拒绝策略。可能有些地方没太注意到 如果有影响到原作者 劳请私信我 我定及时改正。而我们在业务开发过程中,往往会自定义线程池拒绝策略进行处理。

2024-06-29 13:42:11 720

原创 深入理解 JUC 线程池前置知识 FutureTask

在学习线程池之前,需要先学习一下 FutureTask,因为线程池 submit 的结果就是 FutureTask。那么什么是 FutureTask,其表示一个未来的任务。也就是说这个任务比较耗时,当前调用线程会阻塞拿到这个结果。模式可以让线程获得执行的结果,而不用等到线程等到run()方法里面执行完再执行之后的逻辑。这里解释一下什么是异步:A口为,B口为,当时并。Future 接口。

2024-06-28 07:39:04 824

原创 深入理解JUC AQS 条件队列 await() & signal() 核心方法

【代码】深入理解JUC AQS 条件队列 await() & signal() 核心方法。

2024-06-27 06:54:52 261

原创 深入理解 JUC 的AQS 内部核心结构

AbstractQueuedSynchronizer:AQS,抽象队列同步器。主要是为了解决竞争的问题。AQS使用一个volatile修饰的int类型的成员变量state来表示同步状态,1表示其他线程持有锁,0表示锁未被其他线程持有。之所以使用volatile是因为需要保证state成员变量在多线程之间保持可见性,修改state的时候需要使用CAS机制来确保原子性。如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。

2024-06-25 07:57:13 620

原创 深入理解 JUC 的 ReentrantLock 加锁和解锁流程

下面这张图 你需要明白的是先讲解一下大概的流程ReentrantLock 首先lock-》 公平锁或者非公平锁的 lock()-》acquire(1) 就会跑到AQS的代码中。

2024-06-24 16:40:41 379

原创 JAVA并发编程 1. 基石篇 volatile synchronized CAS

4.这里我稍微补充一点 就是 volatile修饰的变量本质上是通过多执行了一个空操作来保证确保了可见性 也就是字节码指令 lock addl $0x0,(%esp) (把ESP寄存器的值加0)这个操作相当于内存屏障。

2024-06-24 13:26:46 603

原创 深入理解 JUC 的 ReentrantReadWriteLock 解锁过程

AQS 内部维护了一个 FIFO(先进先出)的等待队列,用于保存等待获取锁的线程。和加读锁一样 都是需要依靠CAS自旋 然后每个线程都有计数器我在加锁篇已经讲过了。Node 类表示等待队列中的节点,每个节点包含一个等待线程和状态信息。head 是等待队列的头节点(),tail 是尾节点。1.3.1这里讲下题外话 LockSupport。2.1 核心 tryReleaseShared。解锁的流程相较于 加锁 简易了一些。1.1核心tryRelease。2. 接下里我们聊聊读锁的解锁。1.先聊 写锁的解锁。

2024-06-23 20:22:01 279

原创 深入理解 JUC 的 ReentrantReadWriteLock 加锁流程

在非公平模式下,插队指的是获取锁的线程可以不必按照它们到达的顺序来获取锁,而是有机会优先于先前已经在等待队列中的线程获取锁。具体来说,在 ReentrantReadWriteLock 的非公平模式下,写锁的获取允许线程插队,即使等待队列中已经有等待写锁的线程,新的写锁请求线程也有可能直接获取写锁,而不必等待前面的线程。在非公平模式下,如果当前线程请求读锁时,队列头部的后继节点是一个等待获取写锁的节点,就意味着当前线程可能会阻塞等待,避免写锁长时间等待的情况,从而提高写锁获取的优先级。

2024-06-23 17:55:45 306

原创 暑期实习的目的

争取腾讯的转正

2024-06-23 14:08:20 129

原创 今天开始写文章冲刺大厂

加油~

2024-04-07 16:41:15 282

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除