锁绑定多个条件Condition
大厂面试题:
我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?
公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。
CountDownLatch、CyclicBarrier、Semaphore使用过吗?
阻塞队列知道吗?
线程池用过吗?ThreadPoolExecutor谈谈你的理解?
线程池用过吗?生产上你是如何设置合理参数?
死锁编码及定位分析?
锁绑定多个条件Condition代码验证
package com.wwl.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 共享资源类
*/
class ShareResource {
// A:1 B:2 C:30
private int num = 1;
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
// 循环打印5次
public void print5() {
// 1、获取锁资源
lock.lock();
try {
// 2、判断是否可以执行业务
while (num != 1) {
conditionA.await();
}
// 模拟业务执行
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + (i+1));
}
// 3、通知其他线程
num = 2;
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// 循环打印10次
public void print10() {
// 1、获取锁资源
lock.lock();
try {
// 2、判断是否可以执行业务
while (num != 2) {
conditionB.await();
}
// 模拟业务执行
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + (i+1));
}
// 3、通知其他线程
num = 3;
conditionC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// 循环打印15次
public void print15() {
// 1、获取锁资源
lock.lock();
try {
// 2、判断是否可以执行业务
while (num != 3) {
conditionC.await();
}
// 模拟业务执行
for (int i = 0; i < 15; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + (i+1));
}
// 3、通知其他线程
num = 1;
conditionA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
/**
* 锁绑定多个条件Condition
* 题目:多线程之间按顺序执行,实现A->B->C三个线程启动,要求如下:
* A打印5次,B打印10次,C打印15次,
* 紧接着
* A打印5次,B打印10次,C打印15次,
* .
* .
* .
* 循环执行10轮
*/
public class LockConditionDemo {
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
new Thread(()->{
for(int i = 0; i < 10; i++){
shareResource.print5();
}
},"A").start();
new Thread(()->{
for(int i = 0; i < 10; i++){
shareResource.print10();
}
},"B").start();
new Thread(()->{
for(int i = 0; i < 10; i++){
shareResource.print15();
}
},"C").start();
}
}
程序执行结果如下:
Connected to the target VM, address: '127.0.0.1:52817', transport: 'socket'
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
.
.
.
.
.
.