将锁转移到Java中生成的线程

将锁转移到Java中生成的线程,java,multithreading,locking,Java,Multithreading,Locking,在Java中是否有类似的方法(可能使用Lock而不是synchronized): 具体来说,我想替换如下代码: synchronized (lock) { sendResponse(response); doThingsAfterSending(); } synchronized (lock) { Thread t = spawnThread(new Runnable() { @Override public vo

在Java中是否有类似的方法(可能使用
Lock
而不是
synchronized
):

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

    synchronized (lock) {

        sendResponse(response);

        doThingsAfterSending();

    }
    synchronized (lock) {

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

        transferLockOwnership(lock, t);

        return response;

    }
比如说:

    synchronized (lock) {

        sendResponse(response);

        doThingsAfterSending();

    }
    synchronized (lock) {

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

        transferLockOwnership(lock, t);

        return response;

    }

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


如果您需要这样的东西,您必须从基本块中自己构建它:生成您自己的
Lock
-类,它使用
Lock
实现线程安全,但它提供了
transferToThread()
方法。

您考虑过在1个许可证下使用
信号量吗?例如

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();

是的,信号量只是一个线程安全计数器,带有一些阻塞方法。