问题
什么是Java中的互斥和信号量?主要区别是什么?
#1 热门回答(127 赞)
不幸的是,每个人都错过了信号量和互斥量之间最重要的区别; "所有权"的概念。
信号量没有所有权的概念,这意味着任何线程都可以释放信号量(这可能会导致许多问题,但可以帮助"死亡检测")。而互斥锁确实具有所有权的概念(即,你只能释放已获得的互斥锁)。
对于并发系统的安全编程,所有权非常重要。我总是建议使用互斥量优先于信号量(但有性能影响)。
互斥体还可以支持优先级继承(可以帮助解决优先级倒置问题)和递归(消除一种类型的死锁)。
还应该指出,存在"二进制"信号量和"计数/一般"信号量。 Java的信号量是计数信号量,因此允许使用大于1的值初始化它(而如指出的那样,互斥量只能是概念计数为1)。其他职位也指出了这方面的用处。
总而言之,除非你有多个资源需要管理,否则我总是会推荐信号量超过信号量。
#2 热门回答(110 赞)
可以计算信号量,而互斥量只能计为1。
假设你有一个运行的线程接受客户端连接。该线程可以同时处理10个客户端。然后每个新客户端设置信号量直到它达到10.当信号量有10个标志,那么你的线程将不接受新的连接
互斥通常用于保护东西。假设你的10个客户端可以访问系统的多个部分。然后,你可以使用互斥锁保护系统的一部分,因此当1个客户端连接到该子系统时,没有其他人可以访问。你也可以使用信号量来实现此目的。互斥锁是a"Mutual Exclusion Semaphore"。
#3 热门回答(37 赞)
互斥基本上是互斥的。只有一个线程可以一次获取资源。当一个线程获取资源时,在拥有资源的线程释放之前,不允许其他线程获取资源。等待获取资源的所有线程都将被阻止。
信号量用于控制执行的线程数。将有固定的资源集。每当线程拥有相同的资源时,资源计数就会减少。当信号量计数达到0时,则不允许其他线程获取资源。线程被阻塞,直到其他线程拥有资源释放。
简而言之,主要区别在于允许多个线程一次获取资源?
- Mutex - 一个。
- 信号量 - 它的DEFINED_COUNT,(与信号量一样多)