在Java中实现全局锁

时间:2009-06-07 11:05:27

标签: java multithreading locking global

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

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

有没有一种奇特的方法可以在Java中执行此操作而无需重写所有当前的同步代码?

例如,

线程t1

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

线程t2

synchronized (global_lock)
{
    // ...
}

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

非常感谢 如果

3 个答案:

答案 0 :(得分:11)

  1. 这是不可能的;
  2. 这是真的坏主意(抱歉)。
  3. 它容易出现死锁,因为它会强制您为所有锁定预先确定的锁定顺序,无论它们位于何处。

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

    synchronized(LOCK1) {
      synchronized(LOCK2) {
    
      }
    }
    

    但是全局锁需要某种协议 - 全局采购订单 - 用于所有锁。这根本不可能。大多数锁具保护特定的,独立的关键部分。他们不会意识到有人会“掏出”他们并取出他们,因此不会写这些来处理这种情况。

    所以这是不可能的,你应该感到高兴它不是。虽然这似乎是一种简单的方法,但它会给带来很多痛苦。

答案 1 :(得分:0)

撇开您提议的绝对恐怖,您可能需要考虑使用面向方面编程(AOP)在运行时“编织”代码中的其他同步/锁定。您应该能够在不编写源代码的情况下执行此操作。

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

答案 2 :(得分:-1)

唯一可行的方法是实际解析/修改/保存(自动)所有代码。我最近为一个项目做了类似的事情并且工作得非常好。如果您有兴趣,我们可以多说。