机制:每个锁都关联一个请求计数器和一个占有他的线程,当请求计数器为0时,这个锁可以被认为是unhled的,当一个线程请求一个unheld的锁时,JVM记录锁的拥有者,并把锁的请求计数加1,如果同一个线程再次请求这个锁时,请求计数器就会增加,当该线程退出syncronized块时,计数器减1,当计数器为0时,锁被释放。

java锁的可重入性机制可以解决下面这个问题:

public class Widget {
    public synchronized void doSomething() {
        ...
    }
}

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

如果没有Java锁的可重入性,当一个线程获取LoggingWidget的doSomething()代码块的锁后,这个线程已经拿到了LoggingWidget的锁,当调用父类中的doSomething()方法的时,JVM会认为这个线程已经获取了LoggingWidget的锁,而不能再次获取,从而无法调用Widget的doSomething()方法,从而照成死锁。从中我们也能看出,java线程是基于“每线程(per-thread)”,而不是基于“每调用的(per-invocation)”的,也就是说java为每个线程分配一个锁,而不是为每次调用分配一个锁。

最新文章

  1. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)
  2. ajax请求成功后新窗口window.open()被拦截的解决方法
  3. 在mac上获取iphone当前屏幕截图
  4. 项目里总结出来的log4j模板
  5. oracle 11g的企业管理器
  6. Windows远程桌面连接如何直接使用剪贴板功能
  7. CodeForces 689A Mike and Cellphone (模拟+水题)
  8. 使用air进行移动app开发常见功能和问题(一)
  9. 《Linux Device Drivers》第十章 中断处理——note
  10. c语言实现BMP图像转换为灰度图
  11. C#执行javascript代码
  12. 网站全局js代码
  13. 【Leetcode】寻找数串中连续最大整数和且最大长度的子串
  14. (14)[Xamarin.Android] 异步的网络图片下载
  15. Mono+CentOS+Jexus
  16. extJS4.2.0 环境搭建教程(一)
  17. 【吐血整理】svn命令行,Subversion的正确使用姿势~
  18. centos6+cdh5.4.0 离线搭建cdh搭建
  19. javase 基本运算符和三大流程
  20. 详解Maven用户的配置settings.xml

热门文章

  1. [HDU 1203] I NEED A OFFER!
  2. iOS开发 .framework的Optional(弱引用)和Required(强引用)区别, 有错误 Library not found………………
  3. struts1.3异常处理机制
  4. c#集合类的线程安全
  5. android 利用数字证书对程序签名
  6. 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]
  7. [Buffalo]MVC架构模式
  8. NodeJS 框架 Express 从 3.0升级至4.0的新特性
  9. (转载)JDK中的设计模式
  10. Java笔记(一)……概述