繁体   English   中英

在Java中实现全局锁

[英]Implementing a global lock in Java

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

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

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

例如,

线程t1

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

线程t2

synchronized (global_lock)
{
    // ...
}

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

非常感谢,如果

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

它容易出现死锁,因为它会迫使您对所有锁具有预先确定的锁定顺序,无论它们位于何处。

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

synchronized(LOCK1) {
  synchronized(LOCK2) {

  }
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM