可重入锁和不可重入锁
可重入锁和不可重入锁
概念区分
当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized
原理分析
不可重入锁的实现:
public class Lock {
**private** **boolean** isLocked = **false**;
**public** **void** lock() **throws** InterruptedException\{
**while**(isLocked)\{ //如果已经被获取锁,则当前线程只能等待
wait();
\}
isLocked = **true**;
\}
**public** **void** unLock()\{
isLocked = **false**;
\}
}
可重入锁的实例:
public class ReinnerLock {
**private** **boolean** isLocked = **false**;
Thread thread = **null**;//当前的线程
**public** **void** lock() **throws** InterruptedException\{
Thread currentThread = Thread.*currentThread*();
**while**(isLocked && thread!=currentThread)\{
wait();
\}
isLocked = **true**;
thread = currentThread;
\}
**public** **void** unLock()\{
isLocked = **false**;
\}
}
public class LockClient {
// Lock lock = new Lock();
ReinnerLock lock = **new** ReinnerLock();
**void** read() **throws** InterruptedException\{
lock.lock();
System.***out***.println("read");
read1();
lock.unLock();
\}
**void** read1() **throws** InterruptedException\{
lock.lock();
System.***out***.println("read1");
lock.unLock();
\}
**public** **static** **void** main(String\[\] args) \{
**try** \{
//此时执行结果为 read和read1都能打印出来
//如果使用的锁是 Lock则报IllegalMonitorStateException
**new** LockClient().read();
\} **catch** (InterruptedException e) \{
e.printStackTrace();
\}
\}
}
还没有评论,来说两句吧...