【发布时间】:2019-02-14 07:26:17
【问题描述】:
我正在学习 Java 中的 Mutex 和 Semaphore。所以我想弄脏我的手。
我知道 mutex 是来自此 link 的具有单一许可的信号量,并且 mutex 具有来自此 link 的所有权概念。
为了证明所有权,我编写了下面的程序并在下面找到了输出。 当我确实释放多于获取时,它实际上增加了许可的数量。
下面是程序。
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());
// release the lock in main thread
mutex.release();
System.out.println( "available permits are " + mutex.availablePermits());
// release lock in main thread once again
mutex.release();
System.out.println( "available permits are " + mutex.availablePermits());
} catch (Exception e) {
}
Runtime.getRuntime().addShutdownHook(new Thread(() -> es.shutdownNow()));
System.out.println(es.isShutdown());
}
}
输出是 -
mutexWait.isDone() true
successfully released permits for mutex
available permits are 1
available permits are 2
available permits are 3
false
这是预期的行为。如果是这样,它是如何工作的
我的java安装细节-
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
【问题讨论】:
-
如果您想要
Lock行为,请使用Lock。Semaphore不是Lock。
标签: java java-8 mutex semaphore