0 0

线程死锁问题5

 

public class BusyFlag {

    protected Thread busyflag = null;

    public void getBusyFlagBlock() {
        while (true) {
            synchronized (this) {
                if(busyflag == null) {
                    busyflag = Thread.currentThread();
                    break;
                }
            }
            try{
                Thread.sleep(100);
            }catch (Exception e){}
        }
    }

    
    public synchronized boolean tryGetBusyFlag() {
        if(busyflag == null) {
            busyflag = Thread.currentThread();
            return true;
        }
        return false;
    }

 
    public synchronized void freeBusyFlag() {
 
        if(getBusyFlagOwner() == Thread.currentThread()) {
            busyflag = null;
        }
    }

  
    public synchronized Thread getBusyFlagOwner() {
        return busyflag;
    }

}

这是Java线程书上的一段代码。有个问题没搞懂,问下

线程执行freeBusyFlag()方法内,拥有了该对象的锁,在方法体内执行同步的方法getBusyFlagOwner();是可以安全调用的。

但是书中这句是不懂,

 

“但不幸的是,它会阻塞在自己拥有的锁上” 这句不懂

 

 


问题补充:抱歉,已想通。

解答:
书中提到是阻塞在自己的锁上,这种说法有些混淆,让人容易产生误解。
我猜想设计BusyFlag锁,就是为了提高锁作用域的灵活性。
通过:
getBusyFlag();
…….代码块
freeBusyFlag();
可以随意的锁定任何代码的范围。那么随之产生一个问题:一个线程能否在BusyFlag();锁的作用域中,使用同一个BusyFlag锁再次锁定其他的代码呢。如下:
getBusyFlag();
…….代码块
       getBusyFlag();
           ……..
       freeBusyFlag();

…….代码块
freeBusyFlag();
//此上代码的对象锁BusyFlag(); 两次获得都是同一对象锁。
那么我们先前写的代码就会出现阻塞问题。
当第一次获取锁的,已经得到了锁的对象,return true跳出循环。再次获得锁的时候,却是返回return false,则while(tryGetBusyFlag == false)出现死循环阻塞的情况。即便是增加代码:
if (busyflag == Thread.currentThread()) {
    return true;
}
如果是同一对象锁则跳出循环。看似没有了问题。
但是在释放锁的时候
if(getBusyFlagOwner() == Thread.currentThread()) {
   busyflag = null;
}
只要是当前对象锁就会将其释放。但是别忘了,我们一共获得了两次锁,那么就需要释放两次锁,但是此代码一次就可以释放掉。
那么在BusyFlag锁的作用域时,进入由同一个BusyFlag锁实例所锁定的其他范围内就不可能了。因为锁一次就释放掉了。
所以上列的代码是不完全的。可以增加计数器来完善功能。
2013年1月16日 14:18
目前还没有答案

相关推荐

    DllMain和多线程死锁 问题

    DllMain和多线程死锁问题 DllMain是Windows操作系统中的动态链接库(DLL)入口点,当进程和线程启动和终止时被系统调用,分别进行创建资源和释放资源等操作。在DllMain中创建线程或终止线程时,如果违背了DllMain的...

    解决线程死锁问题的 生产者 消费者程序.rar_linux_linux 线程_生产者_生产者 消费者_生产者消费者

    本资源“解决线程死锁问题的 生产者 消费者程序.rar”显然是针对这一问题提供的一种解决方案,它特别关注了Linux环境下的线程管理。"生产者-消费者"模型是一个经典的并发编程模型,用于演示如何有效地共享有限资源,...

    多线程死锁问题

    本篇文章将深入探讨Java中的死锁问题,并通过提供的代码示例`ProducerConsumer.java`、`TestDeadLock.java`和`Count3Quit.java`来解释如何识别和解决死锁。 首先,我们需要理解死锁的四个必要条件: 1. **互斥**:...

    线程死锁的例子

    线程死锁是多线程编程中一个严重的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。这个概念在计算机科学中尤为重要,因为并发执行是提高系统性能的关键手段,但如果不妥善处理,死锁...

    lookcop 线程死锁检测工具

    总的来说,Lookcop是一款强大的工具,它可以帮助开发者在复杂多线程环境中快速定位和解决线程死锁问题,提升程序的可靠性和性能。了解和掌握如何使用Lookcop,对于优化多线程应用的性能至关重要。

    linux多线程死锁问题分析

    在Linux系统中,多线程编程是常见的并发执行方式,然而如果不小心,它可能会引发一些问题,特别是死锁。死锁是指两个或多个线程在等待对方释放资源,导致它们都无法继续执行的状态。在这个特定的案例中,我们看到12...

    Java Swing多线程死锁问题解析

    Java Swing多线程死锁问题解析 Java Swing多线程死锁问题解析是Java开发者经常遇到的问题之一。在基于Java Swing进行图形界面开发时,经常会遇到多线程问题。如果在图形界面的同一个线程中进行查询和运算工作,则会...

    sqlite3.30.1 数据库模块+支持库(彻底解决多线程死锁问题)-易语言

    SQLite3.30.1是SQLite数据库引擎的一个特定版本,专为易语言用户设计,旨在提供一个高效且可靠的多线程数据库解决方案,特别是在处理可能引发死锁问题的并发操作时。SQLite是一个开源、轻量级的嵌入式数据库,常用于...

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    java模拟线程死锁

    线程死锁是 Java 编程中的一种常见的问题,它可以导致程序的崩溃或性能下降。为了避免线程死锁,我们需要在设计线程之间的交互时,遵循一定的规则和原则,例如避免循环等待、使用锁对象和线程通信机制。

    进程线程及死锁

    在操作系统中,死锁是一个重要的问题,因为它可能会导致系统的崩溃。 在实验中,我们使用互斥锁来避免死锁的发生。互斥锁是指一种机制,它可以防止多个进程同时访问同一个共享资源。通过使用互斥锁,我们可以避免...

    DllMain和多线程死锁[归类].pdf

    DllMain 和多线程死锁 DllMain 是可选择的 DLL 入口指针,当进程和线程启动和终止时被系统调用,分别进行创建资源和释放资源等操作。在 DllMain 中创建线程或结束线程时,都特别要注意一个规则,那就是 DllMain 的...

    Linux系统线程死锁实验报告.pdf

    通过分析本篇实验报告的内容,可以了解到线程同步、互斥锁的使用、多线程编程中的死锁问题以及其解决方法。这对于学习和理解多线程并发编程中的同步和互斥机制,以及线程安全编程是非常有价值的。

    QT中sqlite多线程操作4个注意问题

    然而,当在多线程环境中使用SQLite时,需要注意一些关键问题以确保数据的安全性和一致性。以下是四个重要的考虑因素: 1. **线程安全**: SQLite本身并不提供完全的线程安全,这意味着在不同线程中并发访问数据库...

    java多线程死锁预防机制研究

    ### Java多线程死锁预防机制研究 #### 摘要 随着计算机技术的发展和软件系统日益复杂的背景下,多线程编程技术得到了广泛的应用。多线程能够显著提高程序的执行效率,但也随之带来了诸如死锁等问题。死锁是指两个或...

    Java 线程死锁的问题解决办法

    Java 线程死锁的问题解决办法 Java 线程死锁是指两个或两个以上的线程在执行过程中,相互等待对方释放资源,从而造成的僵持状态。在 Java 中,线程死锁的问题解决办法是非常重要的,下面我们将深入探讨 Java 线程...

    线程死锁CPU过高,请求原因分析

    线程死锁是多线程编程中一个严重的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。CPU过高通常与过度的计算、无尽循环、死锁、线程竞争状态等问题相关。在Java编程中,WeakHashMap是一...

Global site tag (gtag.js) - Google Analytics