
【JUC源码】
文章平均质量分 85
【JUC源码】源码学习分享
码农爱java
好记性不如烂笔头,记录技术点滴,保持热爱。come on!
展开
-
深入理解 Java 线程池
线程池就是存放线程的池子,而池子里的线程可以复用,对线程进行统一调度管理,避免过多线程导致影响到整体的性能。原创 2024-04-22 09:21:13 · 719 阅读 · 0 评论 -
ThreadLocal 内存泄漏和常见问题详解
*请牢记 ThreadLocal 不能解决线程安全问题,**ThreadLocal 的诞生并不是为了解决线程安全问题的,而是设计了一种将变量帮绑定到当前线程的机制,更通俗的来说 ThreadLocal 就是为每个线程创建了自己的局部变量,也就是说每个线程中的局部变量在 JVM 中的引用地址没有指向同一个地址,本质就不是同一个变量,因此 ThreadLocal 跟线程安全完全是两回事,简单来说 ThreadLocal 的用处就是把局部变量共享成全局变量,方便变量在线程生命周期中的多个方法中使用。原创 2024-04-20 10:30:00 · 2352 阅读 · 0 评论 -
ThreadLocal 实战使用详解
当前线程的用户信息需要被线程内所有方法共享,也就是需要被线程内部的多个方法使用,比较直接也比较麻烦的解决方案是把用户信息一层层的传递下去,这显然不是一个好的解决方案,这里我们就可以使用 ThreadLocal 来解决了,,,,,,。没错,如果不嫌麻烦,new 一个变量副本作为参数传递是完全可以的,但是对用这种全局变量,使用 ThreadLocal 来维护会大大降低维护成本。根据结果可以知道达到了我们预期的结果,使用 ThreadLocal 传递用户信息十分简单方便,减少了参数传递,且代码结构十分清晰。原创 2024-04-19 09:19:04 · 1662 阅读 · 0 评论 -
ThreadLocal 原理及源码详解
ThreadLocal 是一种提供线程本地变量(也称为线程局部变量)的类,这种变量确保了在不同的线程中访问同一个 ThreadLocal 变量时,每个线程会有一个该变量的私有副本,即使多个线程修改了相同的 ThreadLocal 变量,每个线程所访问的副本仍然是独立的,从而避免了多线程环境下共享变量可能导致的数据不一致和竞争问题。原创 2024-04-18 09:30:00 · 1525 阅读 · 0 评论 -
深入理解 CyclicBarrier【源码分析】
CyclicBarrier 字面意思是环栅栏,是 JUC 下的一个并发工具,跟 CountDownLatch 很相似,都可以使线程先等待然后再执行,但是它的功能比 CountDownLatch 更加复杂和强大, CountDownLatch 是一个或者多个线程等待另外一批线程执行完毕后,在接着执行,而 CyclicBarrier 是等待一批线程到达某个状态之后再同时开始执行,回环的意思是当所有的线程被释放后,CyclicBarrier 可以被重启,也就是可以重复使用。如有错误的地方欢迎指出纠正。原创 2024-04-12 09:30:00 · 551 阅读 · 0 评论 -
CyclicBarrier 使用案例详解
CyclicBarrier 概念:CyclicBarrier 字面意思是环栅栏,是 JUC 下的一个并发工具,跟 CountDownLatch 很相似,都可以使线程先等待然后再执行,但是它的功能比 CountDownLatch 更加复杂和强大, CountDownLatch 是一个或者多个线程等待另外一批线程执行完毕后,在接着执行,而 CyclicBarrier 是等待一批线程到达某个状态之后再同时开始执行,回环的意思是当所有的线程被释放后,CyclicBarrier 可以被重启,也就是可以重复使用原创 2024-04-11 09:26:00 · 3625 阅读 · 0 评论 -
深入理解 Semaphore 【源码分析】
Semaphore 是信号量的意思,一般用来控制同时访问某个资源的线程数量,协调各个线程合理的访问公共资源,Semaphore 的底层依赖的是 AQS。Semaphore 使用计数器来控制对共享资源的访问, 如果计数器大于0,则表示允许访问共享资源, 如果为 0,则表示共享资源已经达到访问的上限就拒绝访问, 计数器的计数的就是允许同时访问共享资源的线程数。原创 2024-04-10 09:30:00 · 1201 阅读 · 0 评论 -
深入理解 CountDownLatch 【源码分析】
项目中要用到一个多线程调用其他系统的接口,并且要等多线程调用完毕后,对返回的结果进行统一处理,返回给客户端,根据业务场景,我很快想到了使用 CountDownLatch 来实现功能,之前多次使用过 CountDownLatch,都没有记录分享,本次记录分享一下,并把对 CountDownLatch 源码的理解一并分享。await 方法本质是等待阻塞,到计数器为 0 的时候,执行await 方法的线程会被唤醒,继续执行业务。根据直接结果可知,是在 main 主线程执行完毕后,线程池中的线程才真正开始执行。原创 2024-04-09 09:30:00 · 1244 阅读 · 0 评论 -
深入理解 AbstractQueuedSynchronizer(AQS)【源码分析】
在 ReentrantLock 篇章中我们提到了 acquire 方法是加锁的核心方法,同时也是 AbstractQueuedSynchronizer 的核心方法,下面我们来分析一下 acquire 方法。acquire 方法调用链路分析://获取锁的方法//这里分为三个方法 tryAcquire 、acquireQueued、addWaiter//tryAcquire 先尝试直接获取锁 看是否能够成功获取。原创 2024-04-08 09:30:00 · 2443 阅读 · 2 评论 -
深入理解 ReentrantLock 【源码分析】
FairSync 公平策略获取锁,根据源码分析我们知道 lock 方法在获取锁的时候,会判断前面是否有等待获取锁的线程的等待时间比当前线程等待的时间长,如果没有等待获取锁时间比当前线程等待获取锁时间长的线程的时候,才会尝试获取锁,简单来说就是排队,这就是公平的策略获取锁。ReentrantLock 是一种基于 AQS 框架的应用实现,是JDK中的一种线程并发访问的同步手段,是一种互斥锁,有公平锁和非公平锁(根据打印时间可以知道,只有三个线程依次获取到锁了,另外两个线程没有获取到锁,程序抛出了异常。原创 2024-04-07 09:30:00 · 1746 阅读 · 1 评论 -
CAS的使用以及底层原理详解
CAS 可以实现无锁情况的下的原子操作,当多线程在修改同一个共享变量的时候,只要一个线程可以更新成功,其他线程会更新失败,失败的线程不会被挂起(这里就节省了线程挂起和唤醒的开销),还可以继续尝试修改,使用 CAS 就实现了 synchronized、ReentrantLock 等锁的同样效果,但开销会更小,因此,CAS操作广泛应用于并发编程中,例如我们熟知的 AbstractQueuedSynchronizer、ReentrantLock 等都广泛使用了 CAS。如有错误的地方欢迎指出纠正。原创 2024-04-03 09:30:00 · 895 阅读 · 0 评论 -
synchronized 锁升级详解
锁是一种用于控制对共享资源访问的机制,它可以确保在某个时刻只有一个线程或进程可以访问被锁定的资源,从而保证数据的一致性和安全性。在计算机科学中,锁常用于并发编程,以解决多线程或多个进程并发访问共享资源时可能出现的数据竞争和不一致性问题。锁升级是指将多个细粒度锁转换为粗粒度锁的过程,叫做锁升级,需要注意的锁只会升级不会降级,锁一旦升级到更高级别,就不会再回到低级别。无锁–>偏向锁–>轻量级锁–>重量级锁。如有错误的地方欢迎指出纠正。原创 2024-04-02 09:30:00 · 1508 阅读 · 0 评论 -
synchronized 使用及深入理解
两个线程同时做 1000 次循环,结果 2000,线程安全没有问题,根据打印结果我们可以知道,两个线程本质是顺序执行的,也就是一个线程获取到锁后,直到他执行完了另外一个线程才可以获取到锁继续执行,两个不同的线程也就是两个不同的实例,这也证明了锁住的是实例对象。两个线程同时做 1000 次循环,结果 2000,线程安全没有问题,注意如果我们开启注释的那行代码,将会线程不安全,因为两个线程用的锁不是同一个,做不到互斥性,所以线程不安全,有兴趣的朋友可以去试一下,这也证明了修饰代码块时候,锁对象是指定的对象。原创 2024-04-01 09:30:00 · 856 阅读 · 0 评论 -
线程常用方法你了解吗(join、yield、interrupt)
线程打断,打断调用者线程,但是 interrupt 方法和 stop 方法有本质区别,它并不会向 stop 方法一样直接中断一个线程的运行,调用 interrupt 方法的线程会继续运行下去,但是会设置一个中断标志 true,由调用者线程决定什么时候来来判执行线程中断,,,,,,,,,,,,,,,,,,。很明显使用 yield 方法,同样的逻辑处理,消耗的时间远大于使用了 yield 方法,证明 yield 方法生效,在实际的开发场景中,yield 方法的使用场景比较少。如有错误的地方欢迎指出纠正。原创 2024-03-30 10:30:00 · 2047 阅读 · 0 评论 -
线程常用方法你了解吗(sleep、wait、notify、notifyAll)
void wait(long timeout, int nanos): 调用者线程等待指定时间,直到其他线程为此线程调用 notify 方法或 notifyAll 方法,或者其他线程中断当前线程,方法提供了一个 nanos 值更好的控制等待的时间,但是根据源码来看,其实并没有真正使用这个值。让线程休眠指定的时间,时间到了线程将会恢复执行,需要注意的是 sleep 方法会让线程让出 cpu 时间片,但是不是释放持有的锁,如果持有锁对象的线程调用了 sleep 方法,那其他线程一样得不到这个锁对象。原创 2024-03-29 09:35:50 · 1063 阅读 · 0 评论 -
线程中 start() 和 run () 方法的区别你了解吗?
总结:其实 start 方法和 run 方法很好理解,一个是创建线程,一直真正的执行多线程的代码,想要实现多线程,就必须要先创建多线程,因此我们启动多线程应该使用 start 方法,run 方法是留给我们自己实现的,重写 run 方法实现自己需要的业务逻辑。run 方法是真正执行线程代码的,只有线程调用了 start 方法后,才可以调用 run 方法,之所以有人说 start 方法实现了多线程,是因为如果直接调用 run 方法,那执行 run 方法中的代码的线程还是主线程,并不会有多线程效果。原创 2024-03-28 09:30:00 · 461 阅读 · 0 评论 -
深入理解 Java 线程状态(线程的状态到底有几种)
总结:操作系统和 Java 中对线程的状态的描述大体一致,Java 中将获取 CPU 时间片模糊化,就绪和运行状态进行了合并,增加了等待的状态,个人觉得 Java 对各个环节的描述更为细致,线程创建后,关键就就在于运行、等待、阻塞、死亡,就绪本身也是一个等待状态,Java 对线程的等待进行了更为细致的划分,分为了无超时和有超时的等待,也是跟线程的一些相关方法相互呼应。Thread.join:调用者线程等待执行的时间,指定时间一到,调用者线程就开始执行,而正在执行的线程就阻塞。线程的状态有几种要分为。原创 2024-03-27 09:30:00 · 746 阅读 · 0 评论 -
实现多线程方式你知道几种?
如有错误的地方欢迎指出纠正。原创 2024-03-26 09:28:10 · 333 阅读 · 0 评论 -
进程与线程、并行与并发,你真得理解了吗?
线程与进程,并行与并发,听起来似乎是兄弟两,面试的时候,也常常被问到这两个问题,那么你到底搞清楚了进程与线程、并行与并发的区别吗?进程是具备一定独立功能的程序在执行的一个过程,进程是资源分配的基本单位,是程序执行的一个实例,进程依赖于程序而存在,进程是操作系统进行资源分配和调度的独立单位,进程有自己的独立的地址空间,跟别的进程相互独立,互不影响。线程是程序运行最小的单位,是进程的一部分,一个进程至少有一个线程,进程中的多个线程可以共享资源,但是没有线程有一套独立的寄存器和线程栈,这样可以保证线程相对独立。原创 2024-03-25 09:44:32 · 617 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用
https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html转载 2021-08-30 15:44:55 · 104 阅读 · 0 评论