
java并发编程
文章平均质量分 65
从多线程的基础知识, 到实际应用场景, 再到底层原理
干饭两斤半
这个作者很懒,什么都没留下…
展开
-
【JUC-10】cyclicBarrier 循环屏障
是Java并发编程中的一种同步工具,它允许一组线程在达到某个共同点之前相互等待。方法进行等待,当所有线程都到达屏障点时,它们被释放,可以继续执行后续操作。可以用于将多个线程分阶段地执行,并在每个阶段结束时进行同步。时,需要指定参与线程的数量。每个线程在到达屏障点之前调用。的工作原理是通过一个可重用的屏障来实现的。原创 2023-07-05 23:58:11 · 282 阅读 · 0 评论 -
【JUC-9】CountdownLatch 同步计数器
是同步器的一种, 也是基于AQS实现的. 是一种倒计时同步器. 当倒计时为0时, 唤醒所有工作线程.原创 2023-07-05 23:56:03 · 338 阅读 · 0 评论 -
【JUC-8】Semaphore 信号量
信号量, 是用来控制线程访问共享资源的数量. 它维护了一个可用的许可数量,线程在访问资源之前必须先获取许可,当许可数量不足时,线程需要等待其他线程释放许可。线程访问完资源后,需要释放许可,以便其他线程可以获取。semaphore自己实现的sync源码, acquire最终调用的是nonfairTryAcquireShared方法。acquire方法底层还是通过AQS来控制工作线程数量的。原创 2023-07-05 23:52:50 · 253 阅读 · 0 评论 -
【JUC-7】ReentrantLock (可重入锁)基础
是一个可以被打断的获取锁操作, 相当于是支持interrupt()方法的lock()方法. 普通的lock()方法如果被其他线程阻塞, 是无法通过interrupt()方法打断的, lockInterruptibly()方法, 是在加锁的时候如果被阻塞, 允许被打断.方法获取任务执行的时候, 队列会判断当前队列中是否存在等待中的任务, 如果存在, 则取出执行, 如果没有, 则进入notEmpty Condition等待. 源码如下。线程池从队列获取任务, 队列中没任务, 则线程进入notEmpty等待。原创 2023-07-04 23:10:57 · 159 阅读 · 0 评论 -
【JUC-6】AQS介绍,基于AQS实现自己的锁
AbstractQueuedSynchronizer(抽象队列同步器,简称AQS)出现在JDK 1.5中。AQS是很多同步器的基础框架,比如ReentrantLock、CountDownLatch和Semaphore等都是基于AQS实现的。除此之外,我们还可以基于AQS,定制出我们所需要的同步器。注意AQS是是, 并不是。原创 2023-07-03 00:03:13 · 185 阅读 · 0 评论 -
【JUC-5】java多线程中的分治框架Fork/Join
Fork/Join是JDK 1.7加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的cpu密集型运算所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。使用ForkJoin框架需要将逻辑操作进行分治. 比较适合可以使用动态规划、回溯、递归等算法实现的逻辑。比如快速排序、二分查找,可以使用ForkJoin来提高运算能力。Fork/Join在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率基本用法。原创 2023-07-02 23:59:22 · 341 阅读 · 0 评论 -
【JUC-4】线程池实战应用
JDK提供的工具类Execurtors创建线程池(), 列举几个Executors中创建线程池的方法;查看Executors的源代码发现, 它创建线程池也是通过来创建线程池的. 当然其中有一些特殊的线程池也不是通过来创建的。比如方法就是通过来创建线程池的. 也有通过ScheduledThreadPoolExecutor创建调度线程池的方法.实际开发中, 也是经常通过ThreadPoolExecutor通过自定义指定核心线程数/最大线程数/缓冲队列/拒绝策略 来创建线程池的.unitworkQueue。原创 2023-07-02 23:59:59 · 162 阅读 · 0 评论 -
【JUC-3】LockSuport介绍
如果调用park()方法时已经满足解除阻塞的条件,则park()方法立即返回,否则线程将被阻塞。方法:unpark()方法用于解除通过park()方法造成的阻塞状态,使得被阻塞的线程可以继续执行。unpark()方法可以指定解除阻塞的线程,即使该线程尚未进入阻塞状态,下一次调用park()方法时也会立即返回。方法的先行发生性:unpark()方法具有先行发生性,即在调用park()方法之前调用unpark()方法,被阻塞的线程调用park()方法时可以立即返回,而不会阻塞。_mutex 互斥量。原创 2023-07-02 23:57:16 · 104 阅读 · 0 评论 -
【JUC-2】Synchronized关键字相关知识
每个JAVA对象都可以关联一个Monitor对象, 如果使用synchonized给对象上锁(重量级)之后, 该对象头的Mark Word就被设置指向Monitor对象的指针, Mark Word中原本的信息如hashcode就会被存到Monitor对象中, 在释放锁的时候, monitor会将这些属性还原到Mark Word中。偏向锁, 锁对象的mark word中记录的是线程id, 当线程重入加锁时, 省去了判断mark word中的地址是否为锁记录的地址.原创 2023-07-02 23:54:17 · 148 阅读 · 0 评论 -
【JUC-1】java多线程线程基础知识
在上面的案例代码中, t.join()方法会让main方法进入wait等待. 阻塞的是main方法. 当t1线程执行完run方法逻辑后. JVM底层就会调用notify方法, 唤醒持有t1锁对象的线程.(join()方法是被synchonized修饰的, 锁对象就是线程对象)Runable/Callable接口的实现, 都是重写其中的run/call方法, 实现任务逻辑, 再由线程执行器(可以是Thread类,也可以是线程池)并发执行run/call的逻辑.JVM唤醒join源码。原创 2023-07-02 23:43:43 · 206 阅读 · 0 评论