`

可重入锁 ReentrantLock

 
阅读更多

推荐 : ReentrantLock与synchronized

1. 什么是可重入锁?

   - “就是可以重新获得锁!”可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。

  看下面代码 :

public class Reentrant{
	public synchronized outer(){
		inner();
	}
	public synchronized inner(){
		//do something
	}
}

 2. ReentrantLock and synchronized的不同:

     - ReentrantLock 必须显示的加锁lock(),最后必须记得unlock() 而 synchronize是内置锁,不需要显示的释放锁

     - ReetrantLock 可以响应中断,可以保证在线程还未获得并且试图获得锁时如果发现线程中断,则抛出异常清除中断标记退出竞争。通过“lockInterruptibly()    

     - 而synchronize不会响应中断!多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。即使你调用了interrupt也是没用的!

     - 公平性,ReentrantLock 的构造方法可以设置一个boolean fair ,获得锁的顺序是不是和申请锁的时间的顺序是一致的 ,不允许插队,默认不公平的!

  

 

4. lock方法

  

/**public void lock() 
获取锁。 
如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。 
如果当前线程已经保持该锁,则将保持计数加 1(state),并且该方法立即返回。 
如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态,此时锁保持计数被设置为 1。 
*/  

 5. 可重入显示锁的简单实现

   

public class Lock{
	boolean isLocked = false;
	Thread  lockedBy = null;
	int lockedCount = 0;

	public synchronized void lock()
		throws InterruptedException{
		Thread callingThread =
			Thread.currentThread();
		while(isLocked && lockedBy != callingThread){
			wait();
		}
		isLocked = true;
		lockedCount++;
		lockedBy = callingThread;
  }

	public synchronized void unlock(){
		if(Thread.curentThread() ==
			this.lockedBy){
			lockedCount--;

			if(lockedCount == 0){
				isLocked = false;
				notify();
			}
		}
	}

	...
}

 6. 原理分析 :

    ReentrantLock的实现依赖于java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。 下面是ReentrantLock的类图(仅画出与本文相关的部分):

 

 

分享到:
评论

相关推荐

    Java源码解析之可重入锁ReentrantLock

    Java源码解析之可重入锁ReentrantLock ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock。它是一个可重入的排他锁,它和synchronized的方法和代码有着相同的行为和语义,但有更多的功能。 ...

    手写可重入锁

    可重入锁,也称为递归锁,是Java并发编程中的一个重要概念,主要在`java.util.concurrent.locks.ReentrantLock`类中实现。这个概念对于理解多线程环境下的同步控制至关重要,尤其对于初学者来说,掌握其原理和用法...

    自己动手写一把可重入锁测试案例

    在Java并发编程中,可重入锁(ReentrantLock)是一种重要的同步机制,它提供了比synchronized更高级、更灵活的锁操作。本篇将基于《Java并发编程:自己动手写一把可重入锁》一文中的案例,深入探讨可重入锁的概念、...

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

    ReentrantLock是一个可重入锁的实现类,可以手动控制锁的获取和释放。synchronized是Java语言的关键字,用于同步方法或代码块,但是synchronized也是一种可重入锁。 在使用可重入锁时,需要注意以下几点: * 可重...

    redislock-基于redis的分布式可重入锁

    在Java中,ReentrantLock是内置的可重入锁,而在分布式环境中,我们可以利用Redis的特性来构建类似的机制。 Redis提供了`SETNX`(Set if Not eXists)命令,可以用于原子性地设置一个键的值,如果键不存在的话。这...

    Java并发编程原理精讲 视频教程 下载 因为太大 百度网盘链接4.zip

    │ 06 可重入锁ReentrantLock的锁定原理.mp4 │ 07 可重入锁ReentrantLock之公平锁.mp4 │ 08 对象条件1.mp4 │ 09 对象条件2.mp4 │ 10 条件对象的注意事项.mp4 │ 11 等待唤醒机制的基本概念.mp4 │ 12 等待...

    Java并发编程原理精讲 视频教程 下载 因为太大 百度网盘链接3.zip

    │ 06 可重入锁ReentrantLock的锁定原理.mp4 │ 07 可重入锁ReentrantLock之公平锁.mp4 │ 08 对象条件1.mp4 │ 09 对象条件2.mp4 │ 10 条件对象的注意事项.mp4 │ 11 等待唤醒机制的基本概念.mp4 │ 12 等待...

    Java并发编程原理精讲 视频教程 下载 因为太大 百度网盘链接1.zip

    │ 06 可重入锁ReentrantLock的锁定原理.mp4 │ 07 可重入锁ReentrantLock之公平锁.mp4 │ 08 对象条件1.mp4 │ 09 对象条件2.mp4 │ 10 条件对象的注意事项.mp4 │ 11 等待唤醒机制的基本概念.mp4 │ 12 等待...

    Java并发编程原理精讲 视频教程 下载 因为太大 百度网盘链接2.zip

    │ 06 可重入锁ReentrantLock的锁定原理.mp4 │ 07 可重入锁ReentrantLock之公平锁.mp4 │ 08 对象条件1.mp4 │ 09 对象条件2.mp4 │ 10 条件对象的注意事项.mp4 │ 11 等待唤醒机制的基本概念.mp4 │ 12 等待...

    Java重入锁ReentrantLock

     从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些。  场景1:如果发现该操作已经在执行中则不再执行(有状态执行)  a、用在定时任务时,如果任务执行时间可能超过下次计划执行时间,...

    教你完全理解ReentrantLock重入锁

    ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重...

    Java并发编程学习笔记

    可重入锁是Java.util.concurrent.locks包下的ReentrantLock类,支持公平锁和非公平锁,具有比synchronized更细粒度的控制。它提供tryLock()方法,可以在无法获取锁时立即返回,而不是等待。 3. **ThreadLocal**: ...

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    4. **可重入锁**:可重入锁允许一个线程获取同一资源的多次锁定,如Java的`synchronized`和`ReentrantLock`。这样可以避免死锁,当一个线程已经持有锁,尝试获取同一锁时,它能再次获得。 5. **互斥锁(Mutex)**:...

    ReentrantLock源码的使用问题详解.docx

    ReentrantLock,可重入锁,是Java并发编程中一个重要的锁实现,它提供了比synchronized更高级别的控制能力,包括公平性和非公平性选择。本文将深入探讨ReentrantLock的原理,特别是其公平锁与非公平锁的概念,以及...

    jnpr-eychen#jun_ppt#锁-重入锁(ReentrantLock)1

    公平和非公平选择这里提到一个锁获取的公平性问题,如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么这个锁是公平的,反之,是不公平的。public void

    Java并发之ReentrantLock类源码解析

    ReentrantLock是Java并发包中的一种同步工具,它可以实现可重入锁的功能。ReentrantLock类的源码分析对理解Java并发机制非常重要。本文将对ReentrantLock类的源码进行详细分析,涵盖ReentrantLock的继承关系、构造...

    ReentrantLock源码详解--公平锁、非公平锁

    ReentrantLock是一种重入锁,实现了Lock接口,能够对共享资源重复加锁,即当前线程获取该锁再次获取不会被阻塞。ReentrantLock的可重入性是通过继承AQS(AbstractQueuedSynchronizer)实现的。 ReentrantLock的主要...

    详解java并发之重入锁-ReentrantLock

    详解 Java 并发之重入锁-ReentrantLock Java 中的并发编程是一种复杂的技术,需要深入了解 Java 的并发机制和锁机制。ReentrantLock 是 Java 中的一种常用锁机制,它提供了一个可重入的锁机制,能够确保线程安全。...

    去故新 Java线程新同步机制

    1、可重入锁ReentrantLock,相当于synchronized块,为临界区提供互斥访问机制。 (1) 相关的接口 创建一个可重入锁 Lock lock = new ReentrantLock(); 请求锁,如果锁被当前另一个线程持有,则阻塞。 void ...

Global site tag (gtag.js) - Google Analytics