多线程同步辅助工具类

Condition

Condition是一种广义上的条件队列,它为线程提供了一种更为灵活的等待/通知模式,
Condition是一个接口,它的实现ConditionObject是AQS的一个内部类,Conditon必须配合锁一起使用。condition调用await会释放锁,调用condition.await()、condition.signal()的线程必须已经获取了锁,否则会抛出IllegalMonitorStateException异常.
Condition的await方法和Object的wait方法的区别是一个能够释放锁,一个不会释放锁

CountDownLatch

其作用是设置一个屏障,当到达屏障点的线程达到指定数量时,继续往下执行。用于控制多线程在某一个点同步等待。内部采用共享锁实现。
构造方法:CountDownLatch(int count) count表示需要达到屏障点的线程数量
核心方法:
    countDown()线程调用该方法,计数减1,当计数为0,放行
    await() 屏障点,使当前线程阻塞,直到count为零时才往下继续执行
缺点:不能重用

循环栅栏CyclicBarrier

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待。
它有两个构造方法:
    CyclicBarrier(int parties):创建一个新的CyclicBarrier,拦截线程数为parties
    CyclicBarrier(int parties,Runnable barrierAction):创建一个CyclicBarrier,拦截线程数位parties,当所有线程到达屏障点时,执行barrierAction中的动作
核心方法await()

优点:可重用
缺点:不能动态增加计数,也不能动态减少计数

信号量 Semaphore

Semaphore资源共享控制器,其作用是控制同一时间内,有多少个线程可以同时访问特定的资源。内部采用共享锁实现。
构造函数:
    Semaphore(int permits):新建一个Semaphore,许可数为permits
    Semaphore(int permits, boolean fair):创建一个有permits个许可和给定公平性的Semaphore
核心方法:
    acquire() 获取一个许可
    acquire(int permits) 获取permits个许可
    release() 释放一个许可
    release(int permits) 释放permits个许可

Exchanger

作用是使得两个线程之间可以进行数据交换
构造方法:
    Exchanger() 创建一个交换器
核心方法:
    exchange(E e)执行数据交换,此方法会阻塞,直到有另一个线程和它进行数据交换或者被打断为止

Java的CAS操作

CAS操作时Java的JUC包的实现基础。Java中的CAS操作依赖于Unsafe类的实现,它提供了硬件级别的原子操作。

来看看Unsafe内常用的比较设置的方法compareAndSwap:
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
它有四个参数,分别表示:对象,对象地址,预期值,修改值

CPU提供了两种方法来实现多处理器的原子操作:总线加锁或者缓存加锁。

总线加锁:总线加锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求都将被阻塞。此方法的缺点显而易见,加锁时,其他处理器均不能处理共享内存,消耗太大
缓存加锁:

猜你喜欢

转载自www.cnblogs.com/canmeng-cn/p/9418261.html