线程完成后是否会释放锁?

2023-11-21

我在一些地方读到,获得一个Lock没有将以下代码括在 a 中的对象try...finally阻塞,这样即使抛出异常也可以释放锁。

这听起来像是一个简单的问题:当线程结束时,属于该线程的所有锁是否都会自动释放?

我问这个问题的原因是,我正在处理的程序是这样的,一旦线程获取锁,它就没有理由放手直到它完成。此外,我是使用锁的新手,所以我想知道是否有任何我可能没有考虑到的陷阱。我是否需要担心在线程完成之前显式释放代码中的锁,或者我可以将其留给 JVM,因为我确信一旦活动线程的锁被阻塞在所有活动线程的锁上,其他线程就会被激活。线程停止?


简单的测试可能会显示锁在线程终止时没有释放:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {
    public static void main(String[] args) {
        final Lock l = new ReentrantLock();

        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread()+": Acquire lock");
                l.lock();
                System.out.println(Thread.currentThread()+": Lock aquired: wait");
                LockSupport.parkNanos(1_000_000_000);
                System.out.println(Thread.currentThread()+"; Exiting");
            }
        };
        t.start();
        LockSupport.parkNanos(500_000_000);
        System.out.println(Thread.currentThread()+": Acquire lock");
        l.lock();
        System.out.println(Thread.currentThread()+"; Success!");
    }
}

Output:

Thread[Thread-0,5,main]: Acquire lock
Thread[Thread-0,5,main]: Lock aquired: wait
Thread[main,5,main]: Acquire lock
Thread[Thread-0,5,main]; Exiting
// "Success" is never written: stuck in dead-lock

因此,当单独的线程获取锁然后退出时,主线程无法获取锁。

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

线程完成后是否会释放锁? 的相关文章

随机推荐

  • 如何在 Nuxt 中使路由区分大小写

    我使用 nuxt js vue js 我需要创建路由器区分大小写 我发现以下属性 caseSensitive 我试图将其放入 nuxt config 但它不起作用 可以通过大写的链接进行转换 如果我直接更改文件 project nuxt r
  • 如何在R中用多边形裁剪世界地图?

    我导入了世界地图数据集www GADM org使用 R 包栅格 我想将其剪切到我创建的多边形中以减小地图的大小 我可以检索数据并且可以毫无问题地创建多边形 但是当我使用 gIntersection 命令时 我收到一条晦涩的错误消息 关于如何
  • JavaMail 与 Gmail:535-5.7.1 用户名和密码不被接受

    当我尝试使用 JavaMail API 发送邮件时收到错误 并且我确信用户名和密码 100 正确 我连接的 Gmail 帐户是一个较旧的帐户 因为他们说它需要时间才能与新帐户一起使用 收到错误 DEBUG SMTP RCVD 535 5 7
  • 无法初始化类 com.amazonaws.partitions.PartitionsLoader

    使用 Eclipse Mars 我已经通过帮助安装软件添加了 aws java sdk 1 11 123 现在 当我运行 Tomcat Server 7 时 出现此错误 May 02 2017 11 57 32 PM org apache
  • C++内部如何实现多态性?

    尊敬的先生 我应该告诉你关于所提出的问题我知道什么和不知道什么 以便你可以解决我理解的薄弱环节 我知道c 通过使用Vtable 指针数组 来实现多态性 每个指针都指向类的虚函数 层次结构中的每个类都有一个虚函数表 现在假设我有以下课程 cl
  • Erlang 函数的返回值

    下面的函数会返回什么 好的原子还是Cmd function test gt Cmd os cmd ls io format The result of ls is p n Cmd 如果它返回 ok 那么应该如何改写以返回 Cmd 同时仍然使
  • CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名

    我正在尝试移植水族总理Mac 到 Windows 的框架 在 Mac 上 它使用 openssl 库 我尝试了解如何将其移植到 Windows 我猜我必须使用 CryptoAPI 我主要需要使用给定的公钥验证生成的签名的代码 以下是使用 o
  • JS、图像和CSS被HTTPModule拦截

    我有一个简单的 HTTPModule 它执行一些自定义会话状态管理 public void Init HttpApplication context context AcquireRequestState new EventHandler
  • 使用标准化表真的更好吗?

    我听到我的团队领导说 在过去的一些项目中 他们必须取消标准化以使查询更快 我认为这可能与表联合有关 拥有更多的瘦表真的比拥有很少的胖表效率低吗 这取决于 连接表本质上比拥有一个 预连接 即非规范化 的大表慢 然而 通过非规范化 您将创建数据
  • 如何判断两个多边形是否相交?

    想象一下 我有 4 个点的坐标 它们形成一个多边形 这些点在 C 中使用 PointF 表示 如果我有 2 个多边形 使用 8 个点 我如何判断它们是否相交 矩形类有一个名为 IntersectsWith 的方法 但我找不到与 Graphi
  • 预编译 JDBCPreparedStatement 有什么作用?

    预编译 语句有什么作用 因为我已经看到了 如果我使用错误的 SQL 语法编写准备好的语句 编译不会报告 任何问题 那么 如果预编译准备好的语句不检查语法有效性 那么它到底做了什么 创建一个PreparedStatements可能涉及也可能不
  • Nokogiri 需要 Ruby 版本 < 2.3

    我正在尝试让 Rails 在 Windows 10 上工作 我正在使用 Ruby 2 3 0 和 Rails 4 2 6 并且暂时使用 Nokogiri 1 6 3 当我尝试跑步时rails new demo 它返回一个错误 An erro
  • akka.net 有没有办法获取或创建 actor

    对于我的 Actor 层次结构 在通过几个 Actor 处理数据之前 我不知道所需的所有 Actor 因此我正在寻找一种方法来返回现有 ActorRef 或创建新操作 这就是我希望下面的代码要么创建一个演员 如果 my id 1 不存在 要
  • 在插入或拖动“和”放置顺序更改后重新索引对象数组的算法

    假设我有一个对象的索引数组 例如包含一首流行民歌的歌词的对象 var lyrics line 2 words He s a lumberjack and he s okay line 1 words I m a lumberjack and
  • ClassCastException:android.widget.LinearLayout$LayoutParams

    因此 我在 FinderActivity class 中执行适配器时收到此错误 public class FinderActivity extends ListActivity private List
  • 方案,SICP,R5RS,为什么延迟不是特殊形式?

    这是关于 SICP 的第 3 5 章 其中正在讨论流 这个想法是 cons stream 1 display hey 不应该评估 cons stream 的第二部分 因此它不应该打印 hey 这确实发生了 我得到以下输出 嘿 1 所以我的结
  • Datastax Cassandra 驱动程序抛出 CodecNotFoundException

    确切的异常如下 com datastax driver core exceptions CodecNotFoundException 找不到请求的操作的编解码器 varchar java math BigDecimal 这些是我正在使用的软
  • PCRE/PHP 中匹配 Unicode 字母字符

    我正在尝试用 PHP 编写一个相当宽松的名称验证器 我的第一次尝试包含以下模式 unicode letters apostrophe hyphen space namePattern p L 这最终被传递给一个调用preg match 据我
  • rmarkdown 生成的 pdf 文档中的表格标题

    如何在 rmarkdown 生成的 pdf document 中的表格浮动中获取标题 Using output pdf document fig caption true and r fig cap a caption myplot 生成一
  • 线程完成后是否会释放锁?

    我在一些地方读到 获得一个Lock没有将以下代码括在 a 中的对象try finally阻塞 这样即使抛出异常也可以释放锁 这听起来像是一个简单的问题 当线程结束时 属于该线程的所有锁是否都会自动释放 我问这个问题的原因是 我正在处理的程序