重入锁

作者: 欢乐时光欢乐你我 | 来源:发表于2020-06-12 11:46 被阅读0次

ReentrantLock:重入锁,它是唯一一个实现了 Lock 接口的类。

synchronized 和 ReentrantLock 都是可重入锁

独占锁:ReentrantLock、ReentrantReadWriteLock.WriteLock
共享锁:ReentrantReadWriteLock.ReadLock、CountDownLatch、CyclicBarrier、Semaphore
其实现方式为:
独占锁实现的是tryAcquire(int)、tryRelease(int)
共享锁实现的是tryAcquireShared(int)、tryReleaseShared(int)

实现原理:

是通过为每个锁关联一个请求计数和一个占有它的线程。
当计数为0时,认为锁是未被占有的。
线程请求一个未被占有的锁时,jvm讲记录锁的占有者,并且讲请求计数器置为1 。
如果同一个线程再次请求这个锁,计数将递增;
每次占用线程退出同步块,计数器值将递减。
直到计数器为0,锁被释放。

重入锁指的是线程在获得锁之后,再次获取该锁不需要阻塞,而是直接关联一次计数器增加重入次数。

比如调用 demo1 方法获得了当前的对象锁,然后在这个方法中再去调用demo2,
demo2 中的存在同一个实例锁,这个时候当前线程会因为无法获得
demo2 的对象锁而阻塞, 如果 不是 重入锁 就会产生死锁。

重入锁的设计目的

重入锁的设计目的是避免线程的死锁。

public class ReentrantDemo{
  public synchronized void demo1(){
    System.out.println("begin:demo1");
    demo2();
  }
  public void demo2(){
    System.out.println("begin:demo1");
    synchronized (this){
    }
  }
  public static void main(String[] args) {
    ReentrantDemo rd=new ReentrantDemo();
    new Thread(rd.demo1()).start();
        }
}
public class AtomicDemo {
  private static int count=0;
  static Lock lock=new ReentrantLock();
  public static void inc(){
       //重入锁
    lock.lock();
    try {
      Thread.sleep(2);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    count++;
    lock.unlock();
  }
  public static void main(String[] args) throws InterruptedException {
     for(int i=0;i<200;i++){
      new Thread(()->{AtomicDemo.inc();}).start();
     }
    Thread.sleep(4000);System.out.println("result:"+count);
  }
}

相关文章

  • java.util.concurrent.locks.Reent

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

  • ReentrantLock 源码分析

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

  • ReentrantLock重入锁

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

  • Java并发编程-重入锁

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

  • Java高并发实战——同步控制工具

    (1)、重入锁(ReentrantLock) 重入锁使用java.util.concurrent.locks.Re...

  • Java中的各种锁

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

  • java可重入锁

    可重入概念: java的可重入锁: 可重入锁的一种实现方式: 可重入锁的两种使用例子: 例子1: 例子2: 例子1...

  • Java多线程 ReentrantLock CAS

    重入锁死 Reentrance Lockout 重入锁死可能会发生在如果一个线程重入一个锁中,ReadWriteL...

  • 各种锁的概念

    锁的概念 可重入不可重入公平锁非公平锁锁中断通过一个故事理解可重入锁的机制 - 小勇DW3 - 博客园[https...

  • java并发-独占锁与共享锁,公平锁与非公平锁,重入锁与非重入锁

    java并发-乐观锁与悲观锁,独占锁与共享锁,公平锁与非公平锁,重入锁与非重入锁 java 中的锁 -- 偏向锁、...

网友评论

      本文标题:重入锁

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