我想要一个Java中的Mutex,它让我在一个线程中等待它,并在另一个线程中释放它。我知道我可以使用容量为1的信号量,但问题是“acquire()”方法会抛出“InterruptedException”。在Java中有什么特别的同步方式可以达到这个目的吗?Java中互斥线程的互斥量?
回答
幸运的是,信号量提供了这种方法对你:)
public void acquireUninterruptibly()
从此信号量获取许可证,阻塞,直到有一个是可用的 。获取许可证(如果有),并立即返回 ,将可用许可证的数量减少一个。
如果没有许可证是可用的,则当前线程用于 线程调度目的,禁止,直到其他线程 调用此信号量和当前线程 是下一个要被分配许可的释放()方法处于休眠状态。
如果在等待许可,然后 它将继续等待当前线程被中断,但在该线程分配 时间的许可证可以改变相比,它会接收到的时间的 许可证没有发生中断。当线程从 这个方法返回时,其中断状态将被设置。
如果你有一个线程将要等待的代码,那么除非你使用同步块,否则你一定要处理中断的异常。另外,中断异常有什么问题?
InterruptedException
不是问题,只是把它包在一个循环:
while(true) {
try {
semaphore.acquire();
break;
} catch(InterruptedException e) {
//swallow, continue;
}
}
但是这个代码是不是很安全,优雅,但将努力为您提供您“要确保你能获得允许!“
如果在catch子句中完成Thread.currentThread()。interrupt(),我会说它几乎是处理这个问题的最好方法(除了使用acquireUninterruptibly方法)。 –
的ThreadA
volatile boolean waitCondition = true
synchronized(lockObject) {
while (waitContidion) {
lockObject.wait();
}
}
ThreadB
synchronized(lockObject) {
waitCondition = false;
lockObject.notifyAll();
}
或锁定实例使用条件/信号。
InterruptedException的正确处理是非常重要的,至少你必须设置它的中断标志与Thread.currentThread()。中断()在catch块的方法。
- 1. 互斥或不互斥互斥?
- 2. Java互斥
- 3. 线程和互斥体
- 4. SQLite多线程互斥体
- 5. boost线程互斥阵列
- 6. 互斥与并行线程
- 7. 互斥和线程独立
- 8. 多线程和互斥锁
- 9. 线程同步,互斥
- 10. 多线程互斥锁可以使用多个互斥锁
- 11. 提升interprocess互斥体vs提升线程互斥体
- 12. JAVA中的互斥量和信号量?
- 13. 互斥
- 14. 互斥
- 15. GNU Make中的互斥量?
- 16. 将非互斥变量重新编码为互斥变量
- 17. 互斥多进程
- 18. Python线程中的信号或互斥
- 19. Linux中的互斥进程
- 20. 在java中获取win32互斥量
- 21. 信号量与互斥量
- 22. 与smp的Java互斥体
- 23. 为什么互斥体不需要互斥体(并且该互斥体需要互斥体...)
- 24. 使NSOperations互斥
- 25. 互斥理解
- 26. Posix Pthread互斥
- 27. 与互斥
- 28. 互斥对象
- 29. 互斥并行
- 30. 使用互斥
为什么中断的异常可能会被抛出? –
在任何旧对象上使用同步块都有问题吗? – Wug
@enno Shioji:我想确保我可以获得许可证! – moorara