可重入锁
【小城贝尔】
锁中套锁锁不死,重新进入有钥匙。
手动实现重入锁,两个同步先入座。
再将三个属性添,计数线程标志签。
一个同步是上锁,标志线程并排过。
进入循环就等待,赋值改签括号外。
还有开锁也同步,计数渐渐小仓库。
判断计数等于零,唤醒线程归初情。
package concurrently.ReentrantLock;
public class ReentrantLockDemo {
}
class EntrantLocks{
//再将三个属性添,计数线程标志签。
int count = 0;
Thread nowThread = null;
boolean isLock = false;
//手动实现重入锁,两个同步先入座。
public synchronized void lock(){
//此时执行该代码的线程
Thread t = Thread.currentThread();
//一个同步是上锁,标志线程并排过。
//进入循环就等待,赋值改签括号外。
while (isLock && (t != nowThread) ){
//进入循环就等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//赋值改签括号外
nowThread = t;
isLock = true;
count ++;
System.out.println("锁住次数 ===》 "+count);
}
public synchronized void open(){
System.out.println("开住次数 ===》 "+count);
//还有开锁也同步,计数渐渐小仓库。
count--;
//判断计数等于零,唤醒线程归初情。
if (count == 0){
//唤醒线程归初情。
notify();
isLock = false;
nowThread = null;
}
}
}
class TestReentrantLock{
EntrantLocks el = new EntrantLocks();
public void start(){
el.lock();
doSome();
el.open();
}
public void doSome(){
el.lock();
System.out.println("do something..................");
el.open();
}
public static void main(String[] args) {
TestReentrantLock test = new TestReentrantLock();
test.start();
/*
锁住次数 ===》 1
锁住次数 ===》 2
do something..................
开住次数 ===》 2
开住次数 ===》 1
*/
}
}