我有以下用例:我有一个有两个方法 m1 和 m2 的类。通常,m1() 不需要同步,但是如果有人调用 m2(),那么只要 m2() 正在执行,m1() 就需要同步。为了实现这一点,我想出了以下代码。你能请。评论它并提出更好的选择?
注意:我意识到这种情况是不切实际的,因为例如,如果某个线程在 m1 的中间,而其他一些线程调用 m2,那么就会出现问题(如果有人指出如何处理,那就太好了那); 尽管如此,我发现思考这个很有趣。
public class DynamicSync
{
volatile MyLock lock;
private final MyLock DUMMY_LOCK = new DummyMyLock();
private final MyLock SYNCHRONIZED_LOCK = new SynchronizedMyLock();
public DynamicSync()
{
lock = DUMMY_LOCK;
}
public void dynamicallySynchronizedMethod() // this is method m1() in the question above
{
lock.lock();
// some logic
lock.unlock();
}
public void setLockAndExecuteLogic() // this is method m2() in the question above
{
synchronized(SYNCHRONIZED_LOCK)
{
lock = SYNCHRONIZED_LOCK;
// some logic
}
}
interface MyLock
{
void lock();
void unlock();
}
class DummyMyLock implements MyLock
{
@Override
public void lock()
{
}
@Override
public void unlock()
{
}
}
class SynchronizedMyLock implements MyLock
{
@Override
public synchronized void lock()
{
// no op
}
@Override
public void unlock()
{
lock = DUMMY_LOCK;
}
}
}
编辑:实际的问题是:我正在设计一个对象池,我需要知道有多少和哪些对象被发出,还有多少剩余。所以我正在考虑维护两个集合:origSet 将是一个包含所有对象的 HashSet,而 dynaSet 将是一个 ConcurrentSkipListSet,我从中发出对象并将它们放回。如果我需要找出 origSet 和 dynaSet 之间的区别瞬间,我需要“冻结” dyanSet 直到计算出差异。但是获得这种差异将是一个非常罕见的操作,因此我的问题。