我有一个关于Java同步的相对简单(也许是愚蠢的)问题。
我有同步块,可以在我的代码中获取各种对象的锁。在某些情况下,我想获取一个全局锁,它包含我的代码中的每个其他同步语句。
有没有一种奇特的方法可以在Java中执行此操作而无需重写所有当前的同步代码?
例如,
synchronized (o1)
{
synchronized (o2)
{
// ...
}
}
synchronized (global_lock)
{
// ...
}
当线程t2在同步块内时,不应允许线程t1获取o1和o2上的锁。
非常感谢 如果
答案 0 :(得分:11)
它容易出现死锁,因为它会强制您为所有锁定预先确定的锁定顺序,无论它们位于何处。
通常,如果你需要获得两把锁,总是有一个预定的顺序,这是一个好主意:
synchronized(LOCK1) {
synchronized(LOCK2) {
}
}
但是全局锁需要某种协议 - 全局采购订单 - 用于所有锁。这根本不可能。大多数锁具保护特定的,独立的关键部分。他们不会意识到有人会“掏出”他们并取出他们,因此不会写这些来处理这种情况。
所以这是不可能的,你应该感到高兴它不是。虽然这似乎是一种简单的方法,但它会给带来很多痛苦。
答案 1 :(得分:0)
撇开您提议的绝对恐怖,您可能需要考虑使用面向方面编程(AOP)在运行时“编织”代码中的其他同步/锁定。您应该能够在不编写源代码的情况下执行此操作。
有许多AOP选项,包括AspectJ和Spring AOP,根据您的环境可能适合。
答案 2 :(得分:-1)
唯一可行的方法是实际解析/修改/保存(自动)所有代码。我最近为一个项目做了类似的事情并且工作得非常好。如果您有兴趣,我们可以多说。