可重入锁和不可重入锁

客官°小女子只卖身不卖艺 2022-05-18 01:41 284阅读 0赞

可重入锁和不可重入锁

概念区分

当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?

不可重入锁:在方法A释放锁之前,不可以再次进入方法B

可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized

原理分析

不可重入锁的实现:

public class Lock {

  1. **private** **boolean** isLocked = **false**;
  2. **public** **void** lock() **throws** InterruptedException\{
  3. **while**(isLocked)\{ //如果已经被获取锁,则当前线程只能等待
  4. wait();
  5. \}
  6. isLocked = **true**;
  7. \}
  8. **public** **void** unLock()\{
  9. isLocked = **false**;
  10. \}

}

可重入锁的实例:

public class ReinnerLock {

  1. **private** **boolean** isLocked = **false**;
  2. Thread thread = **null**;//当前的线程
  3. **public** **void** lock() **throws** InterruptedException\{
  4. Thread currentThread = Thread.*currentThread*();
  5. **while**(isLocked && thread!=currentThread)\{
  6. wait();
  7. \}
  8. isLocked = **true**;
  9. thread = currentThread;
  10. \}
  11. **public** **void** unLock()\{
  12. isLocked = **false**;
  13. \}

}

public class LockClient {

// Lock lock = new Lock();

  1. ReinnerLock lock = **new** ReinnerLock();
  2. **void** read() **throws** InterruptedException\{
  3. lock.lock();
  4. System.***out***.println("read");
  5. read1();
  6. lock.unLock();
  7. \}
  8. **void** read1() **throws** InterruptedException\{
  9. lock.lock();
  10. System.***out***.println("read1");
  11. lock.unLock();
  12. \}
  13. **public** **static** **void** main(String\[\] args) \{
  14. **try** \{

//此时执行结果为 read和read1都能打印出来

//如果使用的锁是 Lock则报IllegalMonitorStateException

  1. **new** LockClient().read();
  2. \} **catch** (InterruptedException e) \{
  3. e.printStackTrace();
  4. \}
  5. \}

}

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读