2

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

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

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

例如,

线程 t1

synchronized (o1)
{
    synchronized (o2)
    {
        // ...
    }
}

线程 t2

synchronized (global_lock)
{
    // ...
}

当线程 t2 在同步块内时,不应允许线程 t1 获取 o1 和 o2 上的锁。

非常感谢如果

4

3 回答 3

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

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

通常,如果您需要获取两个锁,最好始终有一个预定的顺序:

synchronized(LOCK1) {
  synchronized(LOCK2) {

  }
}

但是全局锁需要某种协议——全局获取命令——用于所有锁。这可能根本不可能。大多数锁保护特定的、独立的、关键部分。他们不会意识到有人会将他们“拉”出来并获取他们,因此不会被写来处理这种情况。

所以这是不可能的,你应该很高兴它不是。虽然看起来很轻松,但会带来很多痛苦。

于 2009-06-07T11:18:19.120 回答
1

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

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

于 2009-06-07T14:20:47.643 回答
-1

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

于 2009-06-07T11:21:13.980 回答