ReentrantLock
java.util.concurrent.locks.ReentrantLock;
可重入锁:指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码
支持公平锁和非公平锁,默认非公平锁
案例
public class ReentrantLockDemo3 {
public static void main(String[] args) {
final ShareData shareData = new ShareData();
new Thread("aa"){
@Override
public void run() {
for (int i = 1; i <=5 ; i++) {
shareData.add5();
}
}
}.start();
new Thread("bb"){
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
shareData.add10();
}
}
}.start();
new Thread("cc"){
@Override
public void run() {
for (int i = 1; i <=15 ; i++) {
shareData.add15();
}
}
}.start();
}
}
class ShareData{
private int number = 1;
private Lock lock = new ReentrantLock();
private Condition con1 = lock.newCondition();
private Condition con2 = lock.newCondition();
private Condition con3 = lock.newCondition();
public void add5(){
lock.lock();
try {
while(number != 1){
con1.await();
}
for (int i = 1; i <=5 ; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
number = 2;
con2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void add10(){
lock.lock();
try {
while(number != 2){
con2.await();
}
for (int i = 1; i <=10 ; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
number = 3;
con3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void add15(){
lock.lock();
try {
while(number != 3){
con3.await();
}
for (int i = 1; i <=15 ; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
number = 1;
con1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}