重入锁死与死锁和嵌套管程锁死非常相似。当一个线程重新获取锁,读写锁或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。因此下面的代码是没问题的:
(译者注:这里提到的锁都是指的不可重入的锁实现,并不是Java类库中的Lock与ReadWriteLock类)
public class Reentrant{
public synchronized outer(){
inner();
}
public synchronized inner(){
//do something
}
}
注意outer()和inner()都声明为synchronized,这在Java中这相当于synchronized(this)块(译者注:这里两个方法是实例方法,synchronized的实例方法相当于在this上加锁,如果是static方法,则不然,更多阅读:哪个对象才是锁?)。如果某个线程调用了outer(),outer()中的inner()调用是没问题的,因为两个方法都是在同一个管程对象(即this)上同步的。如果一个线程持有某个管程对象上的锁,那么它就有权访问所有在该管程对象上同步的块。这就叫可重入。若线程已经持有锁,那么它就可以重复访问所有使用该锁的代码块。
下面这个锁的实现是不可重入的:
public class Lock{
private boolean isLocked = false;
public synchronized void lock()
throws InterruptedException{
while(isLocked){
wait();
}
isLocked = true;
}
public synchronized void unlock(){
isLocked = false;
notify();
}
}
如果一个线程在两次调用lock()间没有调用unlock()方法,那么第二次调用lock()就会被阻塞,这就出现了重入锁死。
避免重入锁死有两个选择:
至于哪个选择最适合你的项目,得视具体情况而定。可重入锁通常没有不可重入锁那么好的表现,而且实现起来复杂,但这些情况在你的项目中也许算不上什么问题。无论你的项目用锁来实现方便还是不用锁方便,可重入特性都需要根据具体问题具体分析。
重入锁的实现
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.currentThread() == this.lockedBy) {
lockedCount--;
if (lockedCount == 0) {
isLocked = false;
notify();
}
}
}
}
分享到:
相关推荐
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
Java并发之嵌套管程锁死详解 Java并发编程中,嵌套管程锁死是一个经常出现的问题,严重影响着系统的性能和稳定性。嵌套管程锁死是由多个线程竞争资源导致的死锁现象。 嵌套管程锁死的发生: 嵌套管程锁死的发生是...
`java.util.concurrent.locks.Lock`接口提供比`synchronized`更灵活的锁定机制,如`ReentrantLock`实现了可重入锁,提供了更高的灵活性和效率。 #### 四、Java并发工具类 Java并发编程中常用的一些工具类,这些工具...
Java并发编程涉及到许多关键概念,如线程、同步、锁、并发容器、原子变量以及并发工具类等。以下是一些主要的知识点: 1. **线程基础**:线程是程序执行的最小单位,Java中的`Thread`类提供了创建和管理线程的方法...
2. **并发控制**:讲解synchronized关键字的用法,包括锁的互斥性和可见性,以及可重入锁的概念。同时,也介绍了wait()、notify()和notifyAll()方法在同步控制中的应用。 3. **并发工具类**:如Semaphore(信号量)...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...
synchronized提供了一种内置的、不可中断的锁机制,而Lock接口提供了更细粒度的控制,如可重入、公平性和非阻塞尝试获取锁的能力。乐观锁和悲观锁也是并发控制策略,它们在数据库操作中广泛应用,例如Java的JPA和...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
2. **同步机制**:Java提供了多种同步工具,如synchronized关键字、Lock接口(包括ReentrantLock可重入锁)、Semaphore信号量、CountDownLatch倒计时器等。理解它们的工作原理和使用场景至关重要,因为这能防止数据...
- **重入锁**:`java.util.concurrent.locks.ReentrantLock`提供了比`synchronized`更灵活的锁管理,支持公平锁和非公平锁,可中断和可尝试获取。 - **读写锁**:`ReentrantReadWriteLock`允许多个读取者同时访问...
《Java并发编程实战》这本书是Java并发编程领域的一本经典之作,它深入浅出地讲解了如何在Java环境中高效、安全地进行多线程编程。书中的内容涵盖了从基础概念到高级技术,包括线程的基本操作、同步机制、并发工具类...
《Java并发编程》是一本深度探讨Java平台上的并发与多线程编程的权威书籍,适合对并发编程有深入了解需求的开发者阅读,特别是对于那些志在加入BAT(百度、阿里巴巴、腾讯)等顶级互联网企业的程序员来说,这本书是...
《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...
根据提供的信息,我们可以推断出该视频资源主要围绕“Java并发编程”这一主题展开。由于提供的链接和代码片段无法直接访问或解读具体内容,本篇将基于标题、描述以及标签所暗示的内容来构建相关的知识点。 ### Java...
3. **并发集合**:Java并发集合库提供了一组线程安全的数据结构,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合能够在多线程环境下保持高效性能。 4. **原子操作与CAS**:Atomic类库中的原子变量支持无锁...
- **锁的状态**:可重入、公平性等。 #### 2. 线程池 - **ThreadPoolExecutor**:核心线程池类。 - **Executors工具类**:提供多种预定义的线程池工厂方法。 - **线程池参数配置**:如corePoolSize、...
《JAVA并发编程实践》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握在Java平台上进行高效并发编程的关键知识。本书涵盖了从基本概念到高级特性的全面内容,是Java程序员进阶的必读之作。 ...
《Java并发编程的艺术》这本书是Java开发者深入了解并发编程的重要参考资料。在Java开发中,尤其是在多核处理器和高并发场景下,理解和掌握并发编程是至关重要的。以下是对书中的主要知识点的详细阐述: 1. **Java...