- 博客(15)
- 收藏
- 关注
原创 开源项目前导 剖析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是什么?
在执行业务的时候再次获取该锁,首先也是判断锁是否存在,很明显,锁已经存在了,那么判断锁的标识是否是当前线程的(也就是判断这把锁是不是自己持有了),如果否,证明锁是被其他线程占有,获取锁失败。如果是,需要可重入,则重入次数+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
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人