【Java并发编程】之一:可重入内置锁 (r)
来源:互联网 发布:淘淘居淘宝小号 编辑:程序博客网 时间:2024/06/07 22:41
每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。
当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果摸个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入”意味着获取锁的操作的粒度是“线程”,而不是调用。重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数值置为1,如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为0时,这个锁将被释放。
重入进一步提升了加锁行为的封装性,因此简化了面向对象并发代码的开发。分析如下程序:
子类覆写了父类的同步方法,然后调用父类中的方法,此时如果没有可重入的锁,那么这段代码件产生死锁。
由于Fither和Child中的doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Child对象实例上的锁。如果内置锁不是可重入的,那么在调用super.doSomething时将无法获得该Child对象上的互斥锁,因为这个锁已经被持有,从而线程会永远阻塞下去,一直在等待一个永远也无法获取的锁。重入则避免了这种死锁情况的发生。
同一个线程在调用本类中其他synchronized方法/块或父类中的synchronized方法/块时,都不会阻碍该线程地执行,因为互斥锁时可重入的。
- 【Java并发编程】之一:可重入内置锁 (r)
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- 【Java并发编程】之一:可重入内置锁
- Java并发编程:可重入内置锁
- java并发编程(十二)--可重入内置锁
- Java并发编程(1):可重入内置锁
- Java并发编程(1):可重入内置锁
- Java并发编程之十二:可重入内置锁
- java并发编程之一
- 【Java并发编程】并发编程大合集 (r)
- java并发编程学习之内置锁的可重入性
- 【机器学习】入门的一些资料
- Opencv 矩阵基础
- 依然思路之hashmap源代码
- Python Socket 编程:聊天室示例程序
- 【测试开发面试】阿里二面
- 【Java并发编程】之一:可重入内置锁 (r)
- 贝塞尔结合CAShapeLayer绘制路线,CABasicAnimation实现的小动画
- 大端模式和小端模式
- kvc kvo
- node.js 调试工具 node-inspector
- 动画说明 李明杰新浪博客
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- 初学者之小甲鱼C++运算符重载
- linux下redis的多实例安装配置