ReentrantLock 重入锁

一、Lock接口:

  在Java SE 5之后,并发包中新增了Lock接口及相关实现类来实现锁功能。

 Lock接口和synchronized关键字实现锁的区别:

(1)Lock接口需要显示的获取和释放锁,sychronized是隐式的获取和释放锁。也正因为如此,使得Lock接口拥有了锁获取与释放的可操作性、可中断的获取锁、超时获取锁 等多种synchronized关键字所不具备的同步特性。

例如:一个场景,先获取锁A,然后获取锁B,当B获得后,同时释放A,同时获取锁C。以此类推。这种场景synchronized就不好实现了。

(2)尝试非阻塞的获取锁:当前线程尝试获取锁,若这一时刻没有其他线程获取到该锁,则成功获取并持有锁。

(3)能被中断的获取:获取到锁的线程能够 响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。

(4)超时获取锁:在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回。

Lock lock = new ReentrantLock();
lock.lock;
try{
}finally{
    lock.unlock();
}

2、Lock接口常用API

二、ReentrantLock重入锁

1、ReentrantLock:支持重进入的锁,即:能够支持一个线程对资源的重复加锁。此外该锁还支持获取锁时的公平和非公平性选择,默认是非公平锁。

  ReentrantLock在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁,而不被阻塞。

补充:

锁的公平性:公平性是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,就是FIFO。

  非公平锁可能使线程“饥饿”,而公平锁需要进行大量的线程切换

2、实现机制:

原文地址:https://www.cnblogs.com/guoyu1/p/12179423.html

时间: 2024-11-03 01:26:39

ReentrantLock 重入锁的相关文章

ReentrantLock (重入锁) 源码浅析

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

ReentrantLock 重入锁(下)

前沿: ReentrantLock 是java重入锁一种实现,在java中我们通常使用ReentrantLock 和 synchronized来实现锁功能,本篇通过例子来理解下ReentrantLock使用以及什么是可重入锁. 理解可重入: 1. 锁机制是为了多线程并发访问共享资源情况下为保证线程的安全,和对资源的原子性操作, 举个例子: i=i+1;其实是三部操作首先将i读取到线程的临时区存放,然后加一操作,最后将结果写回去.所谓锁机制就是保证一段程序在某段时间只有一个线程执行. 2. 可重入

ReentrantLock重入锁

上次博客讲到了通过wait()方法和notify()方法来实现循环打印数字和字母得问题.其实使用重入锁也可以实现同样得功能,那么开始我们先通过源码来了解一下重入锁把. public void lock() { sync.lock(); } 首先它有一个lock()方法,它用来加锁,从代码中可以看到,它调用得是sync.lock()方法, public class ReentrantLock implements Lock, java.io.Serializable { private stati

ReentrantLock(重入锁)简单源码分析

1.ReentrantLock是基于AQS实现的一种重入锁. 2.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥饿现象. 3.重入锁/不可重入锁 可重入锁:广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁. 不可重入锁

ReentrantLock(重入锁)功能详解和应用演示

1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock.虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景. 2. ReentrantLock和synchronized的相同点 2.1 ReentrantLock是独占锁且可重入的 例子 public class Reentr

[图解Java]ReentrantLock重入锁

图解ReentrantLock 0. demo 我先给出一个demo, 这样大家就可以根据我给的这段代码, 边调试边看源码了. 还是那句话: 注意"My" , 我把ReentrantLock类 改名为了 "MyReentrantLock"类 , "Lock"类 改名为了"MyLock"类. 大家粘贴我的代码的时候, 把相应的"My"都去掉就好了, 否则会编译报错哦. import java.util.Sca

J.U.C重入锁

ReentrantLock重入锁 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式, 重入的意思就是,如果已经获得了锁,如果执行期间还需要获得这个锁的话,会直接获得所,不会被阻塞,获得锁的次数加1:每执行一次unlock,持有锁的次数减1,当为0时释放锁.这点,Synchronized 具有同样语义. Sync在ReentrantLock中有两种子类:非公平锁NonfairSync.公平锁FairSync,默认情况下为非公平锁. 先判断锁的状态,通过CAS来抢

锁 Lock、重入锁、写入锁

ReentrantLock 重入锁 类似于synchronize 区别与写法上,在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定, 不然会造成锁永远无法释放,其他线程永远进不来的结果.eg: 1 package com.zym.height.Lock01; 2 3 import java.util.concurrent.locks.Lock; 4 import java.util.concurrent.locks.ReentrantLock; 5 6 public class Us

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

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