0 1

如何理解ReentrantLock的可重入和互斥?15

是否可重入,简单的说就是两个不同的执行实体同时调用它有没有可能会出错,会出错就是不可重入, 不出错就是可重入.
对于互斥锁这个标记用来保证在任一时刻,只能有一个线程访问该共享资源。
这样来看的话,不就矛盾了吗,那么该如何理解ReentrantLock的可重入和互斥?

问题补充:另:其中还有个Condition对象,有什么作用及大概如何使用...求大神解惑!
2012年5月26日 10:16

3个答案 按时间排序 按投票排序

0 0

lock.lock
aaa
bbb
ccc
lock.unlock


互斥是表示同一时刻,多个线程中,只能有一个线程能进入aaa bbb ccc部分。但是多个线程都可以调用lock方法,只有一个会成功,其他的线程会被阻塞,直到unlock方法被调用

可重入的意思是某一个线程是否可多次获得一个锁,比如synchronized就是可重入的,ReentrantLock也是可重入的

代码如下

class Parent {
	protected Lock lock = new ReentrantLock();

	public void test() {
		lock.lock();
		try {
			System.out.println("Parent");
		} finally {
			lock.unlock();
		}

	}
}

class Sub extends Parent {

	@Override
	public void test() {
		lock.lock();
		try {
			super.test();
			System.out.println("Sub");
		} finally {
			lock.unlock();
		}
	}
}

public class AppTest {
	public static void main(String[] args) {
		Sub s = new Sub();
		s.test();
	}
}


以上都是个人观点

2012年8月22日 10:12
0 0

java.util.concurrent.locks
类 ReentrantLock
java.lang.Object
  java.util.concurrent.locks.ReentrantLock
所有已实现的接口:
Serializable, Lock

--------------------------------------------------------------------------------

public class ReentrantLockextends Objectimplements Lock, Serializable一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁倾向于将访问权授予等待时间最长的线程。否则此锁将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁)相比,使用公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时。还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。

建议总是 立即实践,使用 lock 块来调用 try,在之前/之后的构造中,最典型的代码如下:

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
}
除了实现 Lock 接口,此类还定义了 isLocked 和 getLockQueueLength 方法,以及一些相关的 protected 访问方法,这些方法对检测和监视可能很有用。

该类的序列化与内置锁的行为方式相同:一个反序列化的锁处于解除锁定状态,不管它被序列化时的状态是怎样的。

此锁最多支持同一个线程发起的 2147483648 个递归锁。试图超过此限制会导致由锁方法抛出的 Error。

2012年6月18日 18:08
0 0

       lock.unlock()
     }
   }
}
除了实现 Lock 接口,此类还定义了 isLocked 和 getLockQueueLength 方法,以及一些相关的 protected 访问方法,这些方法对检测和监视可能很有用。

该类的序列化与内置锁的行为方式相同:一个反序列化的锁处于解除锁定状态,不管它被序列化时的状态是怎样的。

此锁最多支持同一个线程发起的 2147483648 个递归锁。试图超过此限制会导致由锁方法抛出的 Error。

2012年6月18日 18:07

相关推荐

    第15讲 synchronized和ReentrantLock有什么区别呢?1

    ReentrantLock,即可重入锁,是Java 5引入的锁实现,它在功能上与synchronized相似,但提供了更多高级特性。通过调用lock()和unlock()方法,程序员可以更精确地控制锁的获取和释放。ReentrantLock的一个关键特性是可...

    Java多线程 ReentrantLock互斥锁详解

    Java多线程ReentrantLock互斥锁详解 ReentrantLock是Java多线程编程中的一种锁机制,它可以实现线程之间的同步访问资源。ReentrantLock的主要特点是可以重入,即一个线程可以多次获得锁,而不需要释放锁。这种机制...

    ReentrantLock解析

    在Java并发编程中,ReentrantLock是JDK提供的一个可重入互斥锁,它是java.util.concurrent.locks包下的核心类。与synchronized关键字相比,ReentrantLock提供了更高的灵活性,如尝试加锁、定时加锁和公平锁等功能。...

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

    本文将深入探讨标题和描述中提及的各种锁,包括乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁以及行级锁。 1. **乐观锁**:乐观锁假设多线程环境中的冲突较少,所以在读取数据时不加锁,只有...

    线程间互斥2

    2. **ReentrantLock(可重入锁)**:这是 Java Concurrency API 提供的一个高级锁,与 synchronized 相比,ReentrantLock 提供了更细粒度的控制,例如可中断的等待、公平锁和非公平锁等特性。可重入性意味着线程可以...

    ReentrantLock与synchronized

    - 它是可重入的,即一个线程可以多次获取同一锁,不会发生死锁。 2. **使用方式**: - `ReentrantLock`提供`lock()`和`unlock()`方法来加锁和解锁。 - 支持公平锁(通过构造函数传入`true`)和非公平锁(默认)...

    使用ReentrantLock和Lambda表达式让同步更

    `ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个类,它是可重入的互斥锁,具备与`synchronized`相同的基本行为,但增加了许多高级功能。以下是一些`ReentrantLock`的主要特性: 1. **可重入性**...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字相似的同步性,但提供了更多的灵活性和控制功能。本篇文章将深入探讨`...

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换?...ReentrantLock(重入锁)实现原理与公平锁非公平锁区别什么是可重入锁(ReentrantLock)? ThreadLocal内存泄漏分析与

    操作系统实验 多线程同步与互斥 java编写 有界面

    4. **ReentrantLock可重入锁**:除了`synchronized`,Java还提供了一个更高级的锁机制——`java.util.concurrent.locks.ReentrantLock`。它具有与`synchronized`相似的功能,但提供了更多的灵活性,如尝试获取锁、...

    【并发编程】简单化理解AQS和ReentrantLock.pdf

    - **ReentrantLock**:是一个可重入的互斥锁,提供了比`synchronized`关键字更丰富的功能。 - **特点**: - 支持公平锁和非公平锁。 - 可以通过tryLock尝试获取锁,增加灵活性。 - 提供更精细的锁释放控制,避免...

    locks框架_ReentrantLock.pdf

    它的主要特点是可重入性,这意味着一个线程可以多次获取同一锁,从而避免了死锁的风险。 ReentrantLock内部依赖于AbstractQueuedSynchronizer (AQS) 这个抽象同步器,通过AQS的API实现了独占锁功能。AQS维护了一个...

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    1. **可重入性**:ReentrantLock允许一个线程在已经获取锁的情况下再次获取该锁,而不会发生死锁。这对于递归方法或者嵌套同步块特别有用。例如,当一个线程已经获得了锁,然后在同步代码块内部调用了另一个需要相同...

    Multhread.rar_互斥

    在IT领域,多线程编程是一项关键技能,特别是在并发处理和优化系统...通过对这个案例的分析和理解,开发者可以深入掌握多线程编程中的同步控制,从而在实际项目中更好地利用多核处理器的优势,编写出高效且可靠的软件。

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    2. **可重入性**:synchronized也支持可重入,即一个线程已经获得了锁,可以再次进入持有该锁的代码块,这对于递归调用是必要的。 3. **内存可见性**:synchronized能确保线程之间的内存可见性,即当一个线程修改了...

    如何实现程序互斥运行

    理解并正确使用互斥锁能有效地避免数据竞争,提高程序的稳定性和效率。在实际编程中,我们应根据具体需求选择合适的同步机制,并注意防止可能出现的死锁情况。 以上是关于如何实现程序互斥运行的基本介绍和示例,...

    Java多线程并发编程(互斥锁Reentrant Lock)

    2. 可重入锁:ReentrantLock 是可重入锁,即某一线程可以多次获得该锁。 3. 公平锁和非公平锁:ReentrantLock 可以选择实例化一个公平锁或非公平锁,默认情况下会构造一个非公平锁。公平锁可以确保有序性(FIFO 队列...

    7、深入理解AQS独占锁之ReentrantLock源码分析(1).pdf

    ReentrantLock是一种基于AQS框架实现的可重入锁。它可以显式地控制锁的获取和释放,并提供了公平性和非公平性两种获取策略。此外,ReentrantLock还支持尝试获取锁的功能,即在指定时间内尝试获取锁而不阻塞。 #### ...

    Java concurrency之互斥锁_动力节点Java学院整理

    总结来说,`ReentrantLock`是Java并发编程中用于实现互斥锁的重要工具,提供可重入性、公平性和额外的控制功能,帮助开发者编写更安全、高效的多线程程序。在处理高并发场景或需要更高级别控制时,使用`...

Global site tag (gtag.js) - Google Analytics