Java中的互斥体和信号量是什么?主要区别是什么?

Java中的互斥体和信号量是什么?主要区别是什么?


答案 1

不幸的是,每个人都错过了信号量和互斥体之间最重要的区别。“所有权”的概念。

信号量没有所有权的概念,这意味着任何线程都可以释放信号量(这本身就可能导致许多问题,但可以帮助“死亡检测”)。而互斥体确实具有所有权的概念(即,您只能释放已获得的互斥体)。
所有权对于并发系统的安全编程非常重要。我总是建议使用互斥体而不是信号量(但有性能影响)。

互斥体还可以支持优先级继承(这可以帮助解决优先级反转问题)和递归(消除一种类型的死锁)。

还应该指出的是,有“二进制”信号量和“计数/常规”信号量。Java的信号量是一个计数信号量,因此允许它使用大于1的值进行初始化(而,如前所述,互斥体只能是1的概念计数)。其他员额也指出了这一点的用处。

总而言之,除非您有多个资源需要管理,否则我总是建议使用互斥体而不是信号量。


答案 2

信号量可以计数,而互斥体只能计数为 1。

假设您有一个线程正在运行,该线程接受客户端连接。此线程可以同时处理 10 个客户端。然后,每个新客户端设置信号量,直到它达到 10。当信号量有 10 个标志时,您的线程将不接受新连接

互斥体通常用于保护东西。假设您的 10 个客户端可以访问系统的多个部分。然后,您可以使用互斥锁保护系统的一部分,因此当1个客户端连接到该子系统时,其他任何人都无权访问。您也可以将信号量用于此目的。互斥体是“互斥信号量”。


推荐