相关疑难解决方法(0)

106
推荐指数
8
解决办法
11万
查看次数

Java中有Mutex吗?

在java中是否存在Mutex对象或创建一个?我问,因为用1许可证初始化的信号量对象对我没有帮助.想想这个案例:

try {
   semaphore.acquire();
   //do stuff
   semaphore.release();
} catch (Exception e) {
   semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

如果在第一次获取时发生异常,则catch块中的释放将增加许可,并且信号量不再是二进制信号量.

请问是正确的方法吗?

try {
   semaphore.acquire();
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码会确保信号量是二进制的吗?

java mutex semaphore java.util.concurrent concurrent-programming

106
推荐指数
5
解决办法
19万
查看次数

5
推荐指数
2
解决办法
1万
查看次数

当我发布的数量超过获取数量时,Java信号量会增加许可数量

我正在学习Java中的Mutex和Semaphore.所以我想弄脏手.

我理解互斥锁是信号量,具有来自此链接的单一许可,而互斥锁具有来自此链接的所有权概念.

为了证明所有权,我写了下面的程序,并在下面输出.当我发布的数量超过收购数量时,它实际上会增加许可证的数量.

以下是该计划.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;

public class MutexOwnerShipDemo {
    public static void main(String[] args) {
        Semaphore mutex = new Semaphore(1);
        final ExecutorService es = Executors.newSingleThreadExecutor();
        try {
            // acquire mutex lock permit in main thread
            mutex.acquire();

            // release the lock in different thread
            Future mutexWait = es.submit(() -> mutex.release());
            mutexWait.get();
            System.out.println("mutexWait.isDone() " + mutexWait.isDone() );
            System.out.println("successfully released permits for mutex \n " +
                "available permits are " + mutex.availablePermits()); …
Run Code Online (Sandbox Code Playgroud)

java mutex semaphore java-8

4
推荐指数
1
解决办法
596
查看次数