• 多线程同步辅助工具类


    Condition

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

    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#信号,当一个处理器在总线上输出此信号时,其他处理器的请求都将被阻塞。此方法的缺点显而易见,加锁时,其他处理器均不能处理共享内存,消耗太大
    缓存加锁:不直接操作主内存,而是操作高速缓存,通过缓存一致性协议来保证数据的一致性
  • 相关阅读:
    bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    bzoj1016: [JSOI2008]最小生成树计数
    bzoj1051: [HAOI2006]受欢迎的牛
    bzoj1003: [ZJOI2006]物流运输
    bzoj1079: [SCOI2008]着色方案
    bzoj1179: [Apio2009]Atm
    bzoj1877: [SDOI2009]晨跑
    bzoj1821: [JSOI2010]Group 部落划分 Group
    bzoj1305: [CQOI2009]dance跳舞
    bzoj1858: [Scoi2010]序列操作
  • 原文地址:https://www.cnblogs.com/canmeng-cn/p/9418261.html
Copyright © 2020-2023  润新知