`
85977328
  • 浏览: 1910959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java并发(十七)重入锁死

 
阅读更多
重入锁死与死锁和嵌套管程锁死非常相似。当一个线程重新获取锁,读写锁或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。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并发编程与实践

    "Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...

    Java并发之嵌套管程锁死详解

    Java并发之嵌套管程锁死详解 Java并发编程中,嵌套管程锁死是一个经常出现的问题,严重影响着系统的性能和稳定性。嵌套管程锁死是由多个线程竞争资源导致的死锁现象。 嵌套管程锁死的发生: 嵌套管程锁死的发生是...

    java并发编程实践

    `java.util.concurrent.locks.Lock`接口提供比`synchronized`更灵活的锁定机制,如`ReentrantLock`实现了可重入锁,提供了更高的灵活性和效率。 #### 四、Java并发工具类 Java并发编程中常用的一些工具类,这些工具...

    Java 并发编程实战 中英文+代码示例

    2. **并发控制**:讲解synchronized关键字的用法,包括锁的互斥性和可见性,以及可重入锁的概念。同时,也介绍了wait()、notify()和notifyAll()方法在同步控制中的应用。 3. **并发工具类**:如Semaphore(信号量)...

    Java并发编程实践 高清扫描版

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...

    Java并发编程与高并发解决方案(高清视频教程).rar

    synchronized提供了一种内置的、不可中断的锁机制,而Lock接口提供了更细粒度的控制,如可重入、公平性和非阻塞尝试获取锁的能力。乐观锁和悲观锁也是并发控制策略,它们在数据库操作中广泛应用,例如Java的JPA和...

    《java并发编程实践》

    2. **同步机制**:Java提供了多种同步工具,如synchronized关键字、Lock接口(包括ReentrantLock可重入锁)、Semaphore信号量、CountDownLatch倒计时器等。理解它们的工作原理和使用场景至关重要,因为这能防止数据...

    ( java并发编程.zip )文字版 电子书 高清版

    《Java并发编程》是一本深度探讨Java平台上的并发与多线程编程的权威书籍,适合对并发编程有深入了解需求的开发者阅读,特别是对于那些志在加入BAT(百度、阿里巴巴、腾讯)等顶级互联网企业的程序员来说,这本书是...

    龙果学院java并发编程完整视频

    根据提供的信息,我们可以推断出该视频资源主要围绕“Java并发编程”这一主题展开。由于提供的链接和代码片段无法直接访问或解读具体内容,本篇将基于标题、描述以及标签所暗示的内容来构建相关的知识点。 ### Java...

    java虚拟机并发编程.pdf

    3. **并发集合**:Java并发集合库提供了一组线程安全的数据结构,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合能够在多线程环境下保持高效性能。 4. **原子操作与CAS**:Atomic类库中的原子变量支持无锁...

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握在Java平台上进行高效并发编程的关键知识。本书涵盖了从基本概念到高级特性的全面内容,是Java程序员进阶的必读之作。 ...

    Java高并发经典文档-PDF-可在电子书里查看

    另外,`ReentrantLock`是可重入锁,提供了比`synchronized`更灵活的锁定机制。 4. **并发容器**:`ArrayList`、`LinkedList`等集合在并发环境下可能存在安全问题,因此,Java提供了线程安全的集合类,如`Vector`、`...

    java并发编程脑图

    java并发编程脑图总结,线程池、主要使用场景分析,进程:是CPU分配资源的最小单元,是程序的一次动态执行,它对应着从代码加载,执行至完成的一个完整的过程,它有自己的生命周期。它是应用程序的执行实例,每个...

    Java 并发.pdf_电子版pdf版

    Java并发编程是Java开发中不可或缺的一部分,特别是在处理高并发、多线程的互联网应用时尤为重要。本篇将详细解析Java并发中的线程状态转换、线程的使用方式以及相关概念。 一、线程状态转换 Java线程在执行过程中...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **Lock接口与ReentrantLock**:提供更细粒度的锁控制,如可重入锁、公平锁、非公平锁、读写锁等。 - **volatile**:确保变量的可见性,防止指令重排序,但不保证原子性。 3. **并发工具类** - **Executor框架*...

    Java 并发编程示例测试

    Java并发编程是Java平台中的重要特性,它允许程序在多处理器或多线程环境中同时执行多个任务,以提高程序的效率和响应速度。在Java中,`concurrent`包提供了丰富的工具类和接口,用于实现安全、高效的并发操作。本...

    Java并发程序设计+并发

    Java并发程序设计是Java开发中的重要领域,它涉及到如何在多线程环境下高效、安全地执行代码。在Java中,并发编程主要通过类库、工具和技术来实现,这些包括线程、锁、同步机制以及并发容器等。下面将详细介绍Java...

Global site tag (gtag.js) - Google Analytics