博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程——重进入(Reentrancy)机制
阅读量:6122 次
发布时间:2019-06-21

本文共 894 字,大约阅读时间需要 2 分钟。

  hot3.png

       当一个线程请求其他线程已经占有的锁是,请求线程将被阻塞。然后内部锁是可重进入的,因此线程在试图获得它自己占有的锁时,请求会成功。重进入意味着Java的请求是基于“每线程(per-thread)”,而不是基于“没调用(per-invocation)”的。重进入的实现是通过为每个锁关联一个请求计数(acquisition count)和一个占有它的线程。当计数为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且将请求计数置为1。如果同一线程再次请求这个锁,计数将递增;每次占用线程退出同步块,计数器值将递减。直到计数器达到0时,锁被释放。

public class Widget {       public synchronized void doSomething(){               ......       }}public class LoggingWidget extends Widget{      public synchronized void doSomething(){             System.out.println(toString() + ": calling doSomething");             super.doSomething();     }}

        重进入方便了锁行为的封装,因此简化了面向对象并发代码的开发。上面代码中,子类覆写了父类synchronized类型的方法,并调用父类中的方法。如果没有可重入的锁,这段看上去很自然的代码就会产生死锁。因为Widget和LoggingWidget中的doSomething方法都是synchronized类型的,都会在处理前试图获得Widget的锁。倘若内部锁不是可重入的,super.doSomething的调用者就永远无法得到Widget的锁,因为锁已经被占有,导致线程永久地延迟,等待着一个永远无法获得的锁。重进入帮助我们避免了这种死锁。

转载于:https://my.oschina.net/czg/blog/142681

你可能感兴趣的文章
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>
HTML模块化:使用HTML5 Boilerplate模板
查看>>
登记申请汇总
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>
在服务器上用Fiddler抓取HTTPS流量
查看>>
文件类似的推理 -- 超级本征值(super feature)
查看>>