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