可重入锁

本文探讨了可重入锁的工作原理及其在Java中的实现方式,特别是在子类继承父类并重写同步方法时锁的行为。通过具体代码示例解释了为什么在子类中调用父类的同步方法不会导致死锁。

自我记录 自我记录。。。
本文综合:https://blog.youkuaiyun.com/aitangyong/article/details/22695399
https://blog.youkuaiyun.com/joker_apple/article/details/52790181

以线程为单位,如果一个线程获取了某个对象的锁,再次获取该对象时不需要锁,但是其他的线程此时却不能获取该对象

可重入锁的实现原理是为每一个锁设置一个关联计数及线程对象,初始计数为0,当一个线程获取该对象时,jvm为计数器增加为1,再次获取则继续往上增加,当该线程退出一次同步代码块,则计数器减去1,当计数器为0时,即释放锁。

子类继承父类:
创建一个子类的时候,是否会创建一个父类?答案是否定的,在创建一个子类对象的时候,并不会创建一个父类对象。
比如

public class Widget {  
    public synchronized void doSomething() {  
        // do somethig here...  
    }  
}  

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

当我们使用

 class A {
 }
 class B extends A {
 }
 B b = new B()

整个操作产生如下效果:因为new一个对象,因此JVM会分配一块内存地址给B对象(创建B对象),接着利用=将该内存地址的引用指向b。
还需要明确一点的就是,一个类的构造方法只会初始化值,但是不会分配内存空间,即在B的内存空间上初始化了两份数据,一份是B的,而另一份则是A的,但是他们属于同一个对象(子类对象),只是java语法提供了this和super关键字来让我们能够按照需要访问这2份数据
由于doSomething()是synchronized方法,所以执行的时候,会先获取widget对象synchronized方法,所以也必须先获取对象的锁。因为不存在所谓的父对象,或者说父对象就是子对象,所以需要获取的也是widget对象的锁。这样如果不是可重入的锁的话,就会产生死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值