【锁】
1、普通锁。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
Lock lock = new ReentrantLock();
myLock.lock();
myLock.unlock();
2、读写锁。
Lock接口以及对象,使用它,很优雅的控制了竞争资源的安全访问,但是这种锁不区分读写,称这种锁为普通锁。为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,在一定程度上提高了程序的执行效率。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
ReadWriteLock lock = new ReentrantReadWriteLock(false);
myLock.readLock().lock();
myLock.readLock().unlock();
myLock.writeLock().lock();
myLock.writeLock().unlock();
【信号量】
1、信号量是解决消费者、生产者的最经典解决方案。
import java.util.concurrent.Semaphore;
pool.getSp().acquire(x);
pool.getSp().release(x);
【阻塞队列】
阻塞队列的接口java.util.concurrent.BlockingQueue
阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
【条件变量】
import java.util.concurrent.locks.Condition;
private Condition _save = lock.newCondition();
_draw.await();
_save.signalAll();
【原子量】
所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。
import java.util.concurrent.atomic.AtomicLong;
private static AtomicLong aLong = new AtomicLong(10000);
aLong.addAndGet(x)
【障碍器】
Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。
import java.util.concurrent.CyclicBarrier;
CyclicBarrier cb = new CyclicBarrier(7, new MainTask());
cb.await();