synchronized关键字加锁-线程可重入

本文通过一个具体的Java代码示例,解释了线程如何能够重新获得已由其自身持有的锁,即所谓的重入锁概念,并探讨了在没有多线程竞争的情况下如何减少锁的开销。

例子说明


public class ReGetLock implements Runnable {

    @Override
    public void run() {
        get();
    }

    public synchronized void get() {
        System.out.println(Thread.currentThread().getId());
        set();
    }

    public synchronized void set() {
        System.out.println(Thread.currentThread().getId());
    }

    public static void main(String[] args) {
        ReGetLock rgl = new ReGetLock();
        new Thread(rgl).start();
    }

}

执行代码的线程到底能不能进入到set方法呢?

因为线程rgl先调用了get方法,获取到了ReGetLock对象的锁,那么当线程rgl想进入标有synchronized 关键字的set方法时,会被阻塞住,一直等待吗?

其实是不会的,在JAVA里面,当某个线程试图获得一个已经由它自己持有的锁,那么这个请求会成功。不然会出现死锁。

因此像synchronized 这种加锁机制,线程是可重入的。

虽然某个线程试图获得一个已经由它自己持有的锁,那么这个请求会成功,但是再次获得锁的这个动作仍然是有开销的,里面会涉及到一些同步操作。

思考:
如果当共享资源不存在多线程竞争的情况,那么当线程重入时的同步开销能否去掉呢?这个其实就涉及到锁偏向的问题了。

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值