【发布时间】:2018-07-16 21:48:03
【问题描述】:
我想知道使用 ReentrantLock 是否可以解决我的问题;我试图“锁定”(防止其他线程访问/使用它)一个对象,直到某个操作完成,然后解锁它以便其他线程可以访问它。我想过使用 sun 的 Unsafe#monitorEnter/exit 但这可能会导致死锁。
想象以下情况:
public void doSomething() {
Object object = someObject;
// Object should be locked until operation is complete.
doSomethingElse(object);
// Object should now be unlocked so other threads can use/access it.
}
public void doSomethingElse(Object object) {
// Something happens to the object here
}
这会是解决方案吗?
ReentrantLock reentrantLock = new ReentrantLock();
public void doSomething() {
Object object = someObject;
// Object should be locked until operation is complete.
reentrantLock.lock();
doSomethingElse(object);
reentrantLock.unlock();
// Unlock object for other threads after complete.
}
public void doSomethingElse(Object object) {
// Something happens to the object here
}
提前致谢。
【问题讨论】:
-
只有在使用该对象的所有其他代码都使用相同的锁时才有效。为什么不使用
synchronize (object) { doSomethingElse(object); }?当然,其他代码也需要同步。 -
没有想到那个解决方案。但是,想象一下我无法控制访问对象的其他代码的情况,如果有的话,什么是一个好的解决方案?
-
如果您无法控制其他代码,则无法阻止它们访问该对象。没有解决办法。
标签: java concurrency locks reentrantlock