关于Java中的同步,我有一个相对简单(也许很愚蠢)的问题。
我有在代码中获取各种对象锁的同步块。在某些情况下,我想要获取一个全局锁,该锁包含代码中的所有其他同步语句。
在Java中,有没有一种奇妙的方法可以在不重写所有当前同步代码的情况下做到这一点?
例如,
线程t1
synchronized (o1)
{
synchronized (o2)
{
// ...
}
}线程t2
synchronized (global_lock)
{
// ...
}当线程t2位于synchronised块内时,不应允许线程t1获取o1和o2上的锁。
非常感谢,如果
发布于 2009-06-07 11:18:19
它容易死锁,因为它迫使您为所有锁设置一个预先确定的锁定顺序,无论它们在哪里。
通常这是一个好主意,如果你需要获取两个锁,总是有一个预定的顺序:
synchronized(LOCK1) {
synchronized(LOCK2) {
}
}但是全局锁需要某种协议--全局获取顺序--用于所有的锁。而这可能根本就不可能。大多数锁都会保护特定的、独立的、临界区。他们不会意识到有人会“拔出”他们并获得他们,因此不会被写成处理这种情况。
所以这是不可能的,你应该庆幸它不是。虽然这似乎是一条简单的出路,但它会带来很多痛苦。
发布于 2009-06-07 14:20:48
抛开你所提议的可怕之处不谈,你可能想要考虑使用面向方面编程(AOP)在运行时将额外的同步/锁定“编织”到你的代码中。您应该能够在不编写源代码的情况下执行此操作。
有许多AOP选项,包括AspectJ和Spring AOP,它们可能适合您的环境。
发布于 2009-06-07 11:21:14
唯一可行的方法是实际解析/修改/保存(自动)所有代码。我最近为一个项目做了这样的事情,效果很好。如果你感兴趣,我们可以多谈一些。
https://stackoverflow.com/questions/961709
复制相似问题