文章目录
前言
JUC即java.util.concurrent包,这个包下面提供很多用于保证多线程安全的类,比如atomic包下面的原子类、locks包下面和锁相关的类以及其他类。在这篇文章中,我们将讲解JUC下一些常用的类的基本使用。
ReentranLock
public static void testReentrantLock() {
Lock lock = new ReentrantLock();
new Thread(() -> {
try {
lock.lock();
Sleep.sleep(5);
System.out.println("t1 end...");
} finally {
lock.unlock();
}
}).start();
Sleep.sleep(1);
new Thread(() -> {
if (lock.tryLock()) {
try {
System.out.println("tryLock succ");
} finally {
lock.unlock();
}
} else {
System.out.println("tryLock fail");
}
}).start();
}
ReentranLock需要手动调用lock()方法进行加锁,并且需要在finally块中调用unlock()方法释放锁,防止发生异常时出现死锁。除了lock()方法之外,ReentranLock还提供了tryLock()方法尝试获取锁,如果获取失败可以继续执行其他的操作而不用一种阻塞等待。
CountDownLatch
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(1);
new Thread(() -> {
Sleep.sleep(2);
latch.countDown();
}).start();
System.out.println("线程开始");
latch.await();
System.out.println("2s之后,countDown");
}
一个线程A可使用CountDownLatch.await()方法阻塞等待,其他线程可调用CountDownLatch.countDown()方法使CountDownLatch数值减1,当CountDownLatch数值为0的时候,线程A可以继续往下执行。
CyclicBarrier
public void testCycleBarrie() {
CyclicBarrier barrier = new CyclicBarrier(5, () -> {
System.out.println("坐满了,发车!");
});
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentT