网站建设资讯

NEWS

网站建设资讯

Java可重入锁的实现原理与应用场景

可重入锁,从字面来理解,就是可以重复进入的锁。

成都创新互联公司服务项目包括怀柔网站建设、怀柔网站制作、怀柔网页制作以及怀柔网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,怀柔网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到怀柔省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下ReentrantLocksynchronized都是可重入锁。

synchronized是一个可重入锁。在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁。否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法2将永远得不到执行。

可重入锁在什么场景使用呢?

可重入锁主要用在线程需要多次进入临界区代码时,需要使用可重入锁。具体的例子,比如上文中提到的一个synchronized方法需要调用另一个synchronized方法时。

可重入锁的实现原理是怎么样的?

加锁时,需要判断锁是否已经被获取。如果已经被获取,则判断获取锁的线程是否是当前线程。如果是当前线程,则给获取次数加1。如果不是当前线程,则需要等待。

释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。

下面是一个用synchronized实现的例子:

public class ReentrantTest implements Runnable {
  public synchronized void get() {
    System.out.println(Thread.currentThread().getName());
    set();
  }
  public synchronized void set() {
    System.out.println(Thread.currentThread().getName());
  }
  public void run() {
    get();
  }
  public static void main(String[] args) {
    ReentrantTest rt = new ReentrantTest();
    for(;;){
      new Thread(rt).start();
    }
  }
}

整个过程没有发生死锁的情况,截取一部分输出结果如下:

Thread-8492
Thread-8492
Thread-8494
Thread-8494
Thread-8495
Thread-8495
Thread-8493
Thread-8493

set()get()同时输出了线程名称,表明即使递归使用synchronized也没有发生死锁,证明其是可重入的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对创新互联的支持。如果你想了解更多相关内容请查看下面相关链接


网站标题:Java可重入锁的实现原理与应用场景
标题路径:http://njwzjz.com/article/pchohc.html