美文网首页
005 锁的重入性 | 重入锁

005 锁的重入性 | 重入锁

作者: __destory__ | 来源:发表于2019-03-20 15:14 被阅读0次

重入锁

一个进程 获得到某个对象的锁后,在其他地方,又需要获得该对象的锁,此时,可以进入,而不是阻塞。

Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁

重入的特性,发生在同一个线程本身,而且是获得锁后的时间内,再次需要获得锁,不阻塞,直接进入

public synchronized void a () {
    System.out.println("a");
    b();
    
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public synchronized void b() {
    System.out.println("b");
    
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
}

//main方法
Demo d1= new Demo();
new Thread(new Runnable() {
  @Override
  public void run() {
    d1.a();
  }
}).start();

上述,两个synchronized关键词,作用都是一个对象d1(确保是同一个锁了),a方法获得锁,在持有锁期间,需要获得b方法的锁(同一个锁),重入不阻塞。

看是否能够获得锁,需要明确是否是同一个对象的锁,以及是否可重入,如下,

public synchronized void a () {
    System.out.println("a");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public synchronized void b() {
    System.out.println("b");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
Demo d1= new Demo();
new Thread(new Runnable() {
    @Override
    public void run() {
        d1.a();
    }
}).start();
new Thread(new Runnable() {
    @Override
    public void run() {
        d1.b();
    }
}).start();
}

执行顺序(可能)先输出a,等待1秒后,输出b,为什么不是同时输出ab?
因为第一个线程先获得到锁后,对于第二个线程而言,因为是一个锁对象,所以等待,当第一个线程执行完毕后释放锁,第二个线程才能获得锁。可重入性针对是同一个线程而言,多个线程的情况,竞争获得锁

相关文章

  • 005 锁的重入性 | 重入锁

    重入锁 当一个进程 获得到某个对象的锁后,在其他地方,又需要获得该对象的锁,此时,可以进入,而不是阻塞。 Java...

  • ReentrantLock 源码分析

    锁的基本概念 可重入锁 Reentrant 就是可重入的意思,如果锁具备可重入性,则称作为可重入锁。像synchr...

  • J.U.C-AQS-ReentrantLock

    ReentrantLock(可重入锁)和synchronized区别 可重入性 锁的实现(ReentrantLoc...

  • Java中的各种锁

    一个线程中的多个流程能不能获取同一把锁:可重入锁和非可重入锁 可重入锁 可重入性:表明了锁的分配机制,是基于线程的...

  • Java 可重入锁 公平锁 读写锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁。 像synchronized和ReentrantLock都是可...

  • Java温故而知新之Lock与Synchronized

    两者比较: 相关概念解析 可重入锁如果锁具备可重入性,则称作为可重入锁。假设方法A需要获取锁,方法B也需要获取锁,...

  • java.util.concurrent.locks.Reent

    什么是重入锁 重入锁就是指重复进入锁,它表示该锁能够支持一个线程对资源的重复加锁。 重入锁继承与实现关系 重入锁的...

  • Java并发编程-重入锁

    章节目录 什么是重入锁 底层实现-如何实现重入 公平与非公平获取锁的区别与底层实现 1.什么是重入锁 1.1 重入...

  • ReentrantLock重入锁

    一、ReentrantLock重入锁 1、ReentrantLock重入锁简介 ReentrantLock可以完全...

  • 072-JAVA线程安全的重入锁方案【阻塞】

    重入锁(ReentrantLock)的引入就是为了解决同步锁存在活跃性的问题。 不同点: 可重入锁,同个线程可以对...

网友评论

      本文标题:005 锁的重入性 | 重入锁

      本文链接:https://www.haomeiwen.com/subject/qrnzmqtx.html