持有多个锁的线程进入 wait() 状态。它会释放所有持有锁吗?

2024-01-11

我编写了这个程序来检查线程 t1 是否持有两个不同对象的锁: Lock.class 和 MyThread.class 使用 MyThread.class.wait() 在 MyThread.class 实例上进入等待模式。它不会释放 Lock.class 实例上的锁。为什么这样 ?我一直在想,一旦线程进入等待模式或死亡,它就会释放所有获取的锁。

public class Lock {

protected static volatile boolean STOP = true;
public static void main(String[] args) throws InterruptedException {
    MyThread myThread = new MyThread();
    Thread t1 = new Thread(myThread);
    t1.start();
    while(STOP){
    }
    System.out.println("After while loop");
    /*
     * 
     */
    Thread.sleep(1000*60*2);
    /*
     * Main thread should be Blocked.
     */
    System.out.println("now calling Check()-> perhaps i would be blocked. t1 is holding lock on class instance.");
    check();
}

public static synchronized void check(){
    System.out.println("inside Lock.check()");
    String threadName = Thread.currentThread().getName();
    System.out.println("inside Lock.Check() method : CurrrentThreadName : "+ threadName);
}
}


class MyThread implements Runnable{
public MyThread() {
}

@Override
public void run() {
    try {
        System.out.println("inside Mythread's run()");
        classLocking();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static synchronized void classLocking() throws InterruptedException{
    System.out.println("inside Mythread.classLocking()");
    String threadName = Thread.currentThread().getName();
    System.out.println("inside MyThread.classLocking() : CurrrentThreadName : "+ threadName);
    /*
     * outer class locking 
     */
    synchronized (Lock.class) {
        System.out.println("I got lock on Lock.class definition");
        Lock.STOP = false;
        /*
         * Outer class lock is not released. Lock on MyThread.class instance is released.
         */
        MyThread.class.wait();
    }
}
}

你是对的,它不会释放另一个锁。至于为什么,那是因为这样做不安全。如果在调用内部函数期间释放外部锁是安全的,那么为什么要在持有另一个锁的情况下调用内部函数呢?

让一个函数释放一个它没有在程序员背后获取的锁会破坏同步函数的逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持有多个锁的线程进入 wait() 状态。它会释放所有持有锁吗? 的相关文章

  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v

随机推荐

  • 如何获取范围,然后在 Google Apps 脚本中设置值

    我正在尝试在编辑时运行一个函数 该函数将在一系列单元格中查找值 c 然后将其替换为单词 Closed 这是我到目前为止所拥有的 function onEdit e var sheet SpreadsheetApp getActiveSpre
  • 如何以redux形式重置初始值

    我正在使用 redux 形式 我在状态的输入字段中显示初始值 当我单击重置时 输入字段仍然显示初始值 如何重置输入字段 这是我的代码 const mapStateToProps state gt return initialValues n
  • 虚拟盒与 Windows 10 主机的共享文件夹中的符号链接

    我正在虚拟盒子容器中运行 Linux ubuntu 系统 我在共享目录中使用了符号链接 这需要一些额外的工作 如下所述 https www virtualbox org ticket 10085 https www virtualbox o
  • Terraform 强制按计划/应用现有安全组创建新的 ec2 资源

    我有一段非常简单的 Terraform 代码 provider aws region eu west 1 module ec2 source ec2 instance name EC2 Instance 1 其中模块是 variable n
  • 使用material-ui appbar 和material-ui-next 向右或向左浮动的正确方法是什么?

    我不知道在使用material ui next material ui 1 0 0 beta 22 看来他们删除了iconElementRight 来自 API 我们必须使用
  • AWS S3 CLI - 无法连接到终端节点 URL

    aws s3 ls Could not connect to the endpoint URL https s3 us east 1a amazonaws com 可能是什么问题呢 您的默认区域的默认配置文件可能有问题 检查您的文件 aws
  • 捕获异常后判断异常类型?

    即使知道您使用 catch all 捕获了异常 是否有办法确定异常类型 Example try SomeBigFunction catch Determine exception type here 简短回答 不 长答案 如果您从公共基类型
  • Eclipse 中的 SSL 调试

    运行 Eclipse 应用程序时出现以下错误 javax net ssl SSLHandshakeException sun security validator ValidatorException PKIX path building
  • C# 模拟键盘输入

    我需要知道如何模拟按键的键盘输入W S A D 我用过SendKeys没有任何效果以及InputSimulator库没有修复 我想做的是让游戏 战地 自然选择等较新的 FPS 游戏 等应用程序将这些模拟按键注册为真实的按键 我正在尝试制作一
  • 如何从 qml 启动 Qthread?

    我需要立即启动并停止 Qml 文件中的 QThread 扩展类 有什么解决办法吗 这是我的课 class SerialManager public QThread Q OBJECT public CircularList
  • List 和 Set 的性能和内存分配比较

    我想知道List和Set在性能 内存分配和可用性方面的比较 如果我没有任何要求保持对象列表中的唯一性 也不需要维护插入顺序 我可以互换使用ArrayList和SortedSet HashSet吗 直接使用 Collections 类而不是列
  • Delphi onshow 主窗体/模态窗体

    我有一个项目 有一个主窗体和一些其他窗体 当应用程序加载时 它需要执行一些任务并在主窗体顶部以模式形式显示结果 我遇到的问题是 如果我调用函数来执行任务 创建并在主窗体 onshow 事件中显示模态窗体 则模态窗体会出现 但主窗体不会出现
  • Bootstrap 3.3.2 中的媒体列表和文本溢出

    我最近将我的项目从 Bootstrap 3 2 x 更新到 3 3 2 最后一个版本 我发现与媒体对象 http getbootstrap com components media元素 我想在媒体标题中使用特殊的 less mixin te
  • WebViewCoreThre 中的 Android 致命信号 11 (SIGSEGV)

    使用东芝 AT300SE 101 v4 1 1 与其他平板电脑兼容 和一个简单的应用程序 该应用程序因错误而终止 06 19 11 02 12 092 A libc 20030 Fatal signal 11 SIGSEGV at 0x00
  • 如何在 python 中使用 C 扩展来绕过 GIL

    我想在 Python 中跨多个内核运行一个 cpu 密集型程序 并试图找出如何编写 C 扩展来做到这一点 有这方面的代码示例或教程吗 您已经可以将一个 Python 程序分解为多个进程 操作系统已经将您的进程分配给所有核心 Do this
  • 如何在位图上绘制整个表单?

    我想在画布上绘制整个表单 包括其标题栏和框架TBitmap object GetFormImage很酷 但是有两个问题 它也不粉刷窗框 当表单隐藏时它不起作用 您有解决这些问题的想法吗 访问非客户区的关键是GetWindowDC http
  • jUnit不同情况下相同的异常

    我正在为构造函数编写 jUnit 测试 该构造函数解析字符串 然后检查许多内容 当数据错误时 对于每件事 都会抛出一些带有不同消息的 IllegalArgumentException 所以我想为它编写测试 但是我如何识别抛出了什么错误 我该
  • 我如何可以为 UINavigationBar 而不是 UITabBar 的条色调颜色变化设置动画?

    我正在我的应用程序中实现一个主题 但遇到了一个奇怪的错误 功能 由于某些奇怪的原因 我无法使用UIView animate在我的自定义 UITabBarController 类中 对 UITabBar 的颜色变化进行动画处理 但相同的代码在
  • MySQL 在一个查询中获取 Mindate 和 Maxdate

    如何仅使用一个sql查询获取mysql中的最大日期和最小日期 SELECT MIN date col MAX date col FROM table name
  • 持有多个锁的线程进入 wait() 状态。它会释放所有持有锁吗?

    我编写了这个程序来检查线程 t1 是否持有两个不同对象的锁 Lock class 和 MyThread class 使用 MyThread class wait 在 MyThread class 实例上进入等待模式 它不会释放 Lock c