【问题标题】:Java 8 - ReentrantLock/Locking an objectJava 8 - 可重入锁/锁定对象
【发布时间】: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


【解决方案1】:

我建议在 doSomethingElse 上使用同步方法

public void doSomething() {
    Object object = someObject;

    // Object should be locked until operation is complete.
    doSomethingElse(object);
    // Unlock object for other threads after complete.
}

public synchronized void doSomethingElse(Object object) {
    // Something happens to the object here
}

【讨论】:

  • 如果我无法控制访问对象的其他代码,这仍然有效吗?当#doSomethingElse 操作正在运行时,我真的不希望任何东西能够触摸指定的对象。在操作完成之前,第三方应用程序不应该能够触摸对象;这是我的目标。
  • @leapinglasagne 只有对象本身才能正确保护它不被所有使用。
  • @Andreas Sun 的 Unsafe 监视器进入/退出怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多