【Java基础】线程笔记——可重入内置锁

本文探讨了Java中内置锁的工作原理及其重入特性。解释了如何利用这些特性来避免死锁,并确保线程安全。同时介绍了重入锁如何通过计数器机制管理锁的获取与释放。

每个 Java 对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁

获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法

当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果摸个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功

“重入”意味着获取锁的操作的粒度是“线程”,而不是调用

重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为 0 时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM 将记下锁的持有者,并且将获取计数值置为 1,如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为 0 时,这个锁将被释放


重入进一步提升了加锁行为的封装性,因此简化了面向对象并发代码的开发

public class Father  
{  
    public synchronized void doSomething(){  
        System.out.println("father");   
    }  
}  

public class Child extends Father  
{  
    public synchronized void doSomething(){  
        System.out.println("child");  
        super.doSomething();  
    }  
} 

console

child
father

子类覆写了父类的同步方法,然后调用父类中的方法,此时如果没有可重入的锁,那么这段代码件产生死锁。

子类调用doSomething方法时,除了获得自身类锁的同时还会获得父类的锁,如果内置锁不可重入,那调用super.doSomething时就会发生死锁。所谓重入就是,你拿了锁,再调用该锁包含的代码可以不用再次等待拿锁

重入则避免了这种死锁情况的发生

同一个线程在调用本类中其他 synchronized 方法/块或父类中的 synchronized 方法/块时,都不会阻碍该线程地执行,因为互斥锁时可重入的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值