不可重入锁和可重入锁

古城微笑少年丶 2022-01-07 09:57 385阅读 0赞

不可重入锁也叫自旋锁

  指当一个方法调用了锁之后,如持有本锁的另一个方法也想执行,将会进入等待。那么想要使用这个方法必须先释放锁方可调用

  

  1. public class Lock{
  2. private boolean isLocked = false;
  3. public synchronized void lock() throws InterruptedException{
  4. while(isLocked){
  5. wait();
  6. }
  7. isLocked = true;
  8. }
  9. public synchronized void unlock(){
  10. isLocked = false;
  11. notify();
  12. }
  13. }

可重入锁

  指同一个线程里,持有此锁的两个方法将均会执行,不需要先释放,但是另一个持有此锁的线程必须等待锁释放后才能使用

  java里,可重入锁,如 synchronized

  1. public class Lock{
  2. boolean isLocked = false;
  3. Thread lockedBy = null;
  4. int lockedCount = 0;
  5. public synchronized void lock()
  6. throws InterruptedException{
  7. Thread thread = Thread.currentThread();
  8. while(isLocked && lockedBy != thread){
  9. wait();
  10. }
  11. isLocked = true;
  12. lockedCount++;
  13. lockedBy = thread;
  14. }
  15. public synchronized void unlock(){
  16. if(Thread.currentThread() == this.lockedBy){
  17. lockedCount--;
  18. if(lockedCount == 0){
  19. isLocked = false;
  20. notify();
  21. }
  22. }
  23. }
  24. }

不可重入锁例子的话,如下调用

  1. public class Count{
  2. Lock lock = new Lock();
  3. public void print(){
  4. lock.lock();
  5. doAdd();
  6. lock.unlock();
  7. }
  8. public void doAdd(){
  9. lock.lock();
  10. //do something
  11. lock.unlock();
  12. }
  13. }

当调用print的时候,由于获得锁,导致doAdd使用时陷入while循环而等待,所以需要先将锁释放后才可使用

转载于:https://www.cnblogs.com/fengfenghuifei/p/10509661.html

发表评论

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

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

相关阅读