重入 锁

    当某个线程请求由其他线程所持有的锁时,发出请求的线程会被阻塞,然而,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入“意味着获取锁的粒度是”线程“,而不是”调用“。重入的一种实现方法是,为每一个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程持有,当线程请求一个未被持有的锁时,jvm将记下锁的持有者,并且将获取计数值置为1.。如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码时,计数器会相应地递减。当计数值为0时,这个锁就会被释放。

   子类改写了父类的同步方法,然后调用父类中的同步方法,此时如果没有可重入的锁,那么这段代码将产生死锁。由于BaseWidget和Widget中doSomething的方法都是同步的,因此每个同步方法在执行前都会获取BaseWidget上的锁,因为这个锁已被持有,从而线程将永远停顿下去,等待一个永远也无法获取的锁。重入避免了这种死锁情况的发生。


package com.zy.test;

public class Widget extends BaseWidget{
    
    @Override
    public synchronized void doSomething() {
        System.out.println("qqq");
        super.doSomething();
    }
    

}

class BaseWidget {
    public synchronized void doSomething() {
        
    }
}


猜你喜欢

转载自blog.csdn.net/u013276277/article/details/80965343