并发编程
文章平均质量分 87
啊几
What doesn't kill you ,only makes you stronger
展开
-
Phaser详解
Phaser(阶段协同器)是一个Java实现的并发工具类,用于协调多个线程的执行。它提供了一些方便的方法来管理多个阶段的执行,可以让程序员灵活地控制线程的执行顺序和阶段性的执行。Phaser可以被视为和的进化版,它能够自适应地调整并发线程数,可以动态地增加或减少参与线程的数量。所以Phaser特别适合使用在重复执行或者重用的情况。多线程任务分配:Phaser 可以用于将复杂的任务分配给多个线程执行,并协调线程间的合作。原创 2023-05-05 12:18:53 · 937 阅读 · 0 评论 -
CyclicBarrier详解
(回环栅栏或循环屏障),是 Java 并发库中的一个同步工具,通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,可以被重用。以下是一些常见的多线程任务:CyclicBarrier 可以用于将复杂的任务分配给多个线程执行,并在所有线程完成工作后触发后续操作。数据处理:CyclicBarrier 可以用于协调多个线程间的数据处理,在所有线程处理完数据后触发后续操作。原创 2023-05-04 23:03:32 · 360 阅读 · 0 评论 -
AQS详解
所谓的AQS)提供了一套实现锁同步机制的框架,内部定义了很多锁相关的方法,JDK提供的大多数的同步器如Semaphore等都是基于AQS来实现的。一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法作用: 主要用于维护获取锁失败时入队的线程。head和tail分别指向同步等待队列的头和尾,同时同步等待队列是一个双向链表结构,每个节点都有前驱节点(prev)和后继节点(next/**/**用。原创 2023-05-04 22:05:00 · 213 阅读 · 0 评论 -
CountDownLatch详解
CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值(count),由于countDown方法的调用达到0,count为0之后所有等待的线程都会被释放,并且随后对await方法的调用都会立即返回。这是一个一次性现象 —— count不会被重置。原创 2023-05-01 13:29:28 · 235 阅读 · 0 评论 -
Semaphore详解
Semaphore(信号量)是一种用于多线程编程的同步工具,用于控制同时访问某个资源的线程数量。Semaphore维护了一个计数器,线程可以通过调用acquire()方法来获取Semaphore中的许可证,当计数器为0时,调用acquire()的线程将被阻塞,直到有其他线程释放许可证;线程可以通过调用release()方法来释放Semaphore中的许可证,这会使Semaphore中的计数器增加,从而允许更多的线程访问共享资源。原创 2023-05-01 00:36:02 · 280 阅读 · 0 评论 -
ReentrantLock详解
ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一个锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入它的主要应用场景是在多线程环境下对共享资源进行独占式访问,以保证数据的一致性和安全性。示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。原创 2023-04-29 23:08:19 · 1393 阅读 · 0 评论 -
面试必问并发安全问题
1、死锁是必然发生在多操作者(M>=2 个)争夺多个资源(N>=2 个,且 N<=M)才会发生这种情况。很明显,单线程自然不会有死锁,只有 B 一个去,不要 2个,打十个都没问题;单资源呢?只有 13,A 和 B 也只会产生激烈竞争,打得不可开交,谁抢到就是谁的,但不会产生死锁。2、争夺资源的顺序不对,如果争夺资源的顺序是一样的,也不会产生死锁;3、争夺者对拿到的资源不放手。原创 2023-04-23 08:00:00 · 50 阅读 · 0 评论 -
CAS&Atomic 原子操作详解
什么是原子性?相信很多同学在工作中经常使用事务,事务的一大特性就是原子性(事务具有 ACID 四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作 A 和 B都包含多个步骤,如果从执行 A 的线程来看,当另一个线程执行 B 时,要么将 B全部执行完,要么完全不执行 B,执行 B 的线程看 A 的操作也是一样的,那么 A和 B 对彼此来说是原子的。实现原子操作可以使用锁,锁机制。锁从性能上又分为乐观锁和悲观锁。原创 2023-04-22 08:00:00 · 216 阅读 · 0 评论 -
wait 和 notify
线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(what)和“怎么做”(How),简单的办法是让消费者线程不断地循环检查变量是否符合预期在 while 循环中设置不满足的条件,如果条件满足则退出 while 循环,从而完成消费者的工作。很自然的想法是,让消费者和生产者竞争一把锁,竞争到了的,才能够修改count 的值。原创 2023-04-20 12:53:38 · 49 阅读 · 0 评论 -
synchronized 内置锁 和 volatile
关键字 synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,使多个线程访问同一个变量的结果正确,它又称为内置锁机制。不加 volatile 时,子线程无法感知主线程修改了 ready 的值,从而不会退出循环,而加了 volatile 后,子线程可以感知主线程修改了 ready 的值,迅速退出循环。执行结果:子线程可以感知主线程修改了 ready 的值,迅速退出循环。原创 2023-04-20 11:03:24 · 107 阅读 · 0 评论 -
深入学习Java的线程
为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。原创 2023-04-19 21:59:26 · 298 阅读 · 0 评论 -
并发编程的基础概念
同一时刻,一个 CPU 核心只能运行一个线程,也就是 CPU 内核和同时运行的线程数是 1:1 的关系,也就是说 8 核 CPU 同时可以执行 8 个线程的代码。而存在,线程是进程中的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。:指应用能够交替执行不同的任务,比如单 CPU 核心下执行多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已.原创 2023-04-19 15:43:44 · 329 阅读 · 1 评论 -
认识Java里的线程
因为 run 方法里有阻塞调用时会无法很快检测到取消标志,线程必须从阻塞调用返回后,才会检查这个取消标志。这种情况下,使用中断会更好,因为,一、一般的阻塞方法,如 sleep 等本身就支持中断的检查,二、检查中断位的状态和检查取消标志位没什么区别,用中断位的状态还可以避免声明取消标志位,减少资源的消耗。原创 2023-04-19 17:38:48 · 341 阅读 · 1 评论