java 并发类semaphore countdownlatch cyclicbarrier reentrantlock condition reentrantreadwritelock

来源:互联网 发布:寺院设计效果图软件 编辑:程序博客网 时间:2024/05/21 10:48

semaphore

     它是基于计数的信号量,初始时设置阈值。在并发情况下,当前线程首先需要获取许可信号,如果在阈值内则可成功获取,否则阻塞等待;对于获取许可信息的线程,最后必须归还。

  代码如下:

             Semaphore semp = new Semaphore(5); //设置阈值为5 

     semp.acquire(); // 申请许可

      semp.release(); // 释放许可

CountDownLatch

     它是一个线程倒计数器,首先要设置计数的次数并且一旦设置无法更改。它允许一个或多个线程等待,直到其他线程操作结束(计数为0 时)才执行。

     代码如下:

     CountDownLatch countDownLatch = CountDownLatch(5);  // 倒计数为5

     countDownLatch.countDown(); // 减少一个计数

     countDownLatch.await();// 等待直到计数为0时才继续执行


CyclicBarrier 

    它指多个线程同时执行。首先需要设置一起执行的数量,然后等待直到所有人都到齐才执行。

    代码如下:

     CyclicBarrier c = new CyclicBarrier(2); // 设置需要两个线程一起执行

     c.await();// 等待直到满足2个线程的要求,才断续执行。


Reentrantlock


  它是对synchronized的语义化方式改成对象的方法来实现同步机制。


 代码如下:

  Lock lock = new ReentrantLock(); // 实例锁对象

  lock.lock();   // 开启锁

  lock.unlock(); // 释放锁(必须操作)


condition

     Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能,在等待Condition时,允许发生"虚假唤醒",这通常作为对基础平台语义的让步,对于大多数应  用程序,这带来的实际影响很小,因为Condition应该总是在一个循环中被等待,并测试正被等待的状态声明.某个实现可以随意移除可能的虚假唤醒,但是建议程序员总是假定这些虚  假唤醒可能发生,因此总是在一个循环中等待.

 Lock lock = new ReentrantLock();

 Condition condition = lock.newCondition();

 condition.await();

 condition.signal();

 lock.unlock();


reentrantreadwritelock


 读写锁

 对参照:https://my.oschina.net/adan1/blog/158107









0 0
原创粉丝点击