【问题标题】:Transfer a lock to a spawned thread in Java将锁转移到 Java 中的衍生线程
【发布时间】:2011-08-10 09:02:42
【问题描述】:

有没有办法在 Java 中做这样的事情(可能使用Lock 而不是synchronized):

synchronized(lock) {

     Thread t = spawnThread(new Runnable() {

         synchronized(lock) {
            doThing();
         }

     });

     transferLockOwnership(lock, t);

}

具体来说,我想替换如下代码:

    synchronized (lock) {

        sendResponse(response);

        doThingsAfterSending();

    }

这样的:

    synchronized (lock) {

        Thread t = spawnThread(new Runnable() { @Override public void run() {
            synchronized(lock) { doThingsAfterSending(); }
        }});

        transferLockOwnership(lock, t);

        return response;

    }

【问题讨论】:

    标签: java multithreading locking


    【解决方案1】:

    您是否考虑过使用带有 1 个许可证的 Semaphore?例如

    private Semaphore lock= new Semaphore(1);
    
    
    // Instead of synchronized(lock)
    lock.acquireUninterruptibly();
    
    Thread t = spawnThread(new Runnable() {
      @Override public void run() {
        try {
          // Do stuff.
        } finally {
          lock.release();
        }
      }
    });
    
    t.start();
    

    【讨论】:

    • 是否允许发布与获取的线程不同的线程?
    • 是的,信号量只是一个带有一些阻塞方法的线程安全计数器。
    【解决方案2】:

    不,你不能。 Locksynchronized 使用的监视器只能由单个线程持有。并且将它“移动”到另一个需要释放锁并重新获取,这包括 另一个 线程获取它而不是所需的线程的危险。

    如果你需要这样的东西,你必须自己从基本块构建它:生产你自己的Lock-like class 使用 @987654324 @ 是线程安全的,但它提供了 transferToThread() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2011-10-27
      相关资源
      最近更新 更多