在Java中实现全局锁

2 java multithreading locking global

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

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

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

例如,

线程t1

synchronized (o1)
{
    synchronized (o2)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

线程t2

synchronized (global_lock)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢,如果

Rob*_*anu 11

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

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

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

synchronized(LOCK1) {
  synchronized(LOCK2) {

  }
}
Run Code Online (Sandbox Code Playgroud)

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

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