首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中实现全局锁

在Java中实现全局锁
EN

Stack Overflow用户
提问于 2009-06-07 11:05:27
回答 3查看 4.1K关注 0票数 2

关于Java中的同步,我有一个相对简单(也许很愚蠢)的问题。

我有在代码中获取各种对象锁的同步块。在某些情况下,我想要获取一个全局锁,该锁包含代码中的所有其他同步语句。

在Java中,有没有一种奇妙的方法可以在不重写所有当前同步代码的情况下做到这一点?

例如,

线程t1

代码语言:javascript
复制
synchronized (o1)
{
    synchronized (o2)
    {
        // ...
    }
}

线程t2

代码语言:javascript
复制
synchronized (global_lock)
{
    // ...
}

当线程t2位于synchronised块内时,不应允许线程t1获取o1和o2上的锁。

非常感谢,如果

EN

回答 3

Stack Overflow用户

发布于 2009-06-07 11:18:19

  1. 这是不可能的;
  2. 这是一个非常糟糕的主意(对不起)。

它容易死锁,因为它迫使您为所有锁设置一个预先确定的锁定顺序,无论它们在哪里。

通常这是一个好主意,如果你需要获取两个锁,总是有一个预定的顺序:

代码语言:javascript
复制
synchronized(LOCK1) {
  synchronized(LOCK2) {

  }
}

但是全局锁需要某种协议--全局获取顺序--用于所有的锁。而这可能根本就不可能。大多数锁都会保护特定的、独立的、临界区。他们不会意识到有人会“拔出”他们并获得他们,因此不会被写成处理这种情况。

所以这是不可能的,你应该庆幸它不是。虽然这似乎是一条简单的出路,但它会带来很多痛苦。

票数 11
EN

Stack Overflow用户

发布于 2009-06-07 14:20:48

抛开你所提议的可怕之处不谈,你可能想要考虑使用面向方面编程(AOP)在运行时将额外的同步/锁定“编织”到你的代码中。您应该能够在不编写源代码的情况下执行此操作。

有许多AOP选项,包括AspectJ和Spring AOP,它们可能适合您的环境。

票数 1
EN

Stack Overflow用户

发布于 2009-06-07 11:21:14

唯一可行的方法是实际解析/修改/保存(自动)所有代码。我最近为一个项目做了这样的事情,效果很好。如果你感兴趣,我们可以多谈一些。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/961709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档