将锁转移到Java中生成的线程
在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
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();
是的,信号量只是一个线程安全计数器,带有一些阻塞方法。