JUC.locks包中的Lock接口中的内容,比较常用的我在之前的博客中已经介绍的不少了,所以此篇博客仅仅是为了提醒自己Lock接口也是JUC中非常重要的一块内容,别被自己遗忘了。
locks包中,
重要接口:
- Lock
- Condition
- ReadWriteLock
重要类:
- ReentrantLock
- ReentrantReadWriteLock
关于ReentrantLock:https://blog.csdn.net/Vaingloryss/article/details/99189465
关于ReentrantReadWriteLock:https://blog.csdn.net/Vaingloryss/article/details/99414388
再附一个小案例:
使用Re使用ReentrantLock 和 Condition 实现三个线程交替输出A 、B、 C:
打印类:
package basis.stuJUC.stuLock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Alternative {
private int index = 1;
private Lock lock = new ReentrantLock();
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();
//输出A
public void printA(){
lock.lock();
try {
if(index!=1){
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("A");
index = 2;
conditionB.signal();
}finally {
lock.unlock();
}
}
//输出B
public void printB(){
lock.lock();
try {
if(index!=2){
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("B");
index = 3;
conditionC.signal();
}finally {
lock.unlock();
}
}
//输出C
public void printC(){
lock.lock();
try {
if(index!=3){
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
};
}
System.out.println("C");
System.out.println("------------------");
index = 1;
conditionA.signal();
}finally {
lock.unlock();
}
}
}
主类(测试类):
package basis.stuJUC.stuLock;
public class Test {
public static void main(String[] args) {
Alternative alternative = new Alternative();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<20;i++){
alternative.printA();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<20;i++){
alternative.printB();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<20;i++){
alternative.printC();
}
}
}).start();
}
}
测试结果(部分):
A
B
C
------------------
A
B
C
------------------
A
B
C
------------------