Exchanger 是一个用于线程间交换数据的工具类,其作用是让两个线程在同步点交换数据。它通过以下方式实现线程间交换数据:
初始化 Exchanger: 当创建 Exchanger 实例时,不需要指定任何参数。
线程调用 exchange() 方法: 当线程需要交换数据时,它必须先调用 exchange() 方法。如果另一个线程也调用了 exchange() 方法,则两个线程都会被阻塞,直到另一个线程也调用 exchange() 方法。此时,两个线程可以交换数据,然后继续执行后续代码。
线程执行完毕: 当线程执行完毕后,它会继续执行后续代码,直到遇到另一个 Exchanger 或程序结束。
Semaphore 是一个用于控制并发线程数的工具类,其作用是允许一定数量的线程同时访问临界资源。它通过以下方式实现控制并发线程数:
初始化 Semaphore: 当创建 Semaphore 实例时,需要指定一个许可数,表示可以同时访问临界资源的线程数量。
线程调用 acquire() 方法: 当线程需要访问临界资源时,它必须先调用 acquire() 方法获取一个许可。如果当前可用的许可数大于 0,则线程获取许可并继续执行;如果当前可用的许可数等于 0,则线程会被阻塞,直到其他线程释放许可。
线程调用 release() 方法: 当线程访问完临界资源后,它必须调用 release() 方法释放一个许可,以便其他线程可以获取许可并访问临界资源。
CyclicBarrier 是一个用于线程间协作的工具类,其作用是让一组线程到达一个屏障(同步点)后,被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
CyclicBarrier 通过以下方式实现线程到达同步点后继续执行:
线程调用 CyclicBarrier 的 await() 方法: 当线程调用 await() 方法时,它会被阻塞,直到其他所有线程也调用了 await() 方法,此时屏障才会打开,所有线程继续执行。
线程执行完毕: 当线程执行完毕后,它会继续执行后续代码,直到遇到另一个 CyclicBarrier 或程序结束。
屏障重置: 在所有线程都执行完毕后,CyclicBarrier 会自动重置,屏障关闭,线程可以再次进入同步点。
CountDownLatch 是一个同步工具类,用于使一个或多个线程等待,直到某个线程执行特定的操作。它内部维护一个计数器,初始值为 count。每个线程调用 countDown() 方法,将计数器减 1。当计数器减到 0 时,所有等待的线程都将被唤醒,继续执行。
CountDownLatch 的作用:
等待多个线程完成: 当程序需要多个线程并行执行任务,并且主线程需要等待所有线程完成后再继续执行时,可以使用 CountDownLatch。
同步线程执行顺序: 当程序中存在多个线程需要按照特定顺序执行时,可以使用 CountDownLatch 来控制线程的执行顺序。
LongAdder 的原理:
LongAdder 内部包含两个主要的成员变量:
base:用于存储单个线程对数值的修改。
cells:一个数组,用于存储多个线程对数值的修改。
当多个线程并发修改数值时,LongAdder 会根据哈希算法将线程分配到 cells 数组的各个槽位中,每个线程只对自己槽位中的值进行 CAS 操作。这样,线程之间的竞争就被分散到不同的槽位上,减少了冲突的概率,从而避免了大量的 CAS 空自旋,提高了并发效率。