可重入锁的获取和释放须要注意的一点儿事

什么是可重入锁,不可重入锁呢?"重入"字面意思已经非常明显了,就是能够又一次进入。可重入锁,就是说一个线程在

获取某个锁后,还能够继续获取该锁,即同意一个线程多次获取同一个锁。比方synchronized内置锁就是可重入的

,假设A类有2个synchornized方法method1和method2,那么method1调用method2是同意的。

显然重入锁给编程带

来了极大的方便。假如内置锁不是可重入的,那么导致的问题是:1个类的synchornized方法不能调用本类其它

synchornized方法,也不能调用父类中的synchornized方法。与内置锁相应,JDK提供的显示锁ReentrantLock也是可

以重入的,这里主要说下可重入锁的释放须要的事儿。

public static void main(String[] args) throws Exception
{
    final ReentrantLock lock = new ReentrantLock();

    Thread t = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            lock.lock();
            System.out.println("execute");
            lock.unlock();
        }
    });

    lock.lock();
    lock.lock();
    t.start();

    Thread.sleep(200);
    System.out.println("realse one once");

    lock.unlock();
}

上面的代码会出现死锁。由于主线程2次获取了锁,可是却仅仅释放1次锁,导致线程t永远也不能获取锁。一个线程获

多少次锁,就必须释放多少次锁。这对于内置锁也是适用的,每一次进入和离开synchornized方法(代码块),就是

一次完整的锁获取和释放。

时间: 2024-10-14 09:36:01

可重入锁的获取和释放须要注意的一点儿事的相关文章

可重入锁的获取和释放需要注意的一点儿事

什么是可重入锁,不可重入锁呢?"重入"字面意思已经很明显了,就是可以重新进入.可重入锁,就是说一个线程在 获取某个锁后,还可以继续获取该锁,即允许一个线程多次获取同一个锁.比如synchronized内置锁就是可重入的 ,如果A类有2个synchornized方法method1和method2,那么method1调用method2是允许的.显然重入锁给编程带 来了极大的方便.假如内置锁不是可重入的,那么导致的问题是:1个类的synchornized方法不能调用本类其他 synchorn

ReentrantLock (重入锁) 源码浅析

一.ReentrantLock简介ReentrantLock重入锁,顾名思义,就是支持重入的锁,它表示能够支持一个线程对资源的重复加锁:我们之前学习过Synchronized锁,它也是支持重入的一种锁,参考我的另一篇Synchronized 锁的实现原理与应用,Synchronized支持隐式的重入锁,比如递归方法,在方法运行时,执行线程在获取到了锁之后仍能连续多次地获取锁:ReentrantLock虽然不能隐式重入,但是获取到锁的线程多次调用lock方法,不会阻塞进入同步队列:除此之外在获取锁

【死磕Java并发】-----J.U.C之重入锁:ReentrantLock

此篇博客所有源码均来自JDK 1.8 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制.它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大.灵活的锁机制,可以减少死锁发生的概率. API介绍如下: 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大.ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥

Java并发程序设计(12)并发锁之可重入锁ReentrantLock

1.1. 可重入锁ReentrantLock ReentrantLock是java并发库中提供的可重入锁.与synchronized同步块相比,有相似也有不同.相似的地方有: (1)都可以实现多线程之间的同步,避免对共享资源的访问冲突. (2)都是可重入的,即一个已经获取锁的线程可以再次获得同一个锁,synchronized也类似. 不同的地方有: (1)ReentrantLock更灵活,获取锁和释放锁可以在同一个方法中,也可以在不同方法中.synchronized通常用在同一个方法体内. (2

可重入锁(good)

可重入锁,也叫做递归锁,是指在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法[即可重入],而无需重新获得锁:https://www.zhihu.com/question/23284564/answer/29633571 对于不同线程则相当于普通的互斥锁. 在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁 最大的作用是避免死锁.在很多情况下线程需要多次进入锁内执行任务

重入锁----ReentrantLock

本节主要从下述四个方面介绍重入锁. 1.什么是重入锁? 2.为什么要引用重入锁? 3.重入锁是怎么实现的? 4.分析java并发包中ReentrantLock. 什么是重入锁 重入锁,支持重进入的锁,表示该锁能够支持一个线程对它重复加锁,即线程在获得锁之后再次获取该锁时不会被阻塞. 为什么要引用重入锁? 以子类重写父类方法为例: Mutix是不支持重入的锁.(代码摘抄自<java并发编程的艺术>) 1 import java.util.concurrent.TimeUnit; 2 import

可重入锁 &amp; 自旋锁 &amp; Java里的AtomicReference和CAS操作 &amp; Linux mutex不可重入

之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自> http://www.cnblogs.com/charlesblc/p/5935326.html <[Todo] 乐观悲观锁,自旋互斥锁等等> http://www.cnblogs.com/charlesblc/

Java并发编程-可重入锁

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍可以获取该锁而不受影响.在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁. [java]public class Test implements Runnable{ public synchronized void get(){ System.out.println(Thread.currentThread().getId()); set(); } public synchroni

重入锁

重入锁ReentrantLock 支持一个线程对同一个资源进行多次加锁. 支持获取锁时的公平和非公平性选择 锁获取的公平性问题: 先对锁进行获取的请求一定先被满足,那么这个锁是公平的,反之,是不公平的.ReentrantLock提供了一个构造函数(传人一个布尔值),来控制锁是否是公平的 1.实现重进入 锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取. 线程重复n次获取了锁,随后在第n次释放该锁后,其他线程才能够获取到该锁.锁被获取时,计数自增,而锁被释放时,计数自减,当计