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

问题

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

#1 热门回答(127 赞)

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

信号量没有所有权的概念,这意味着任何线程都可以释放信号量(这可能会导致许多问题,但可以帮助"死亡检测")。而互斥锁确实具有所有权的概念(即,你只能释放已获得的互斥锁)。

对于并发系统的安全编程,所有权非常重要。我总是建议使用互斥量优先于信号量(但有性能影响)。

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

还应该指出,存在"二进制"信号量和"计数/一般"信号量。 Java的信号量是计数信号量,因此允许使用大于1的值初始化它(而如指出的那样,互斥量只能是概念计数为1)。其他职位也指出了这方面的用处。

总而言之,除非你有多个资源需要管理,否则我总是会推荐信号量超过信号量。

#2 热门回答(110 赞)

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

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

互斥通常用于保护东西。假设你的10个客户端可以访问系统的多个部分。然后,你可以使用互斥锁保护系统的一部分,因此当1个客户端连接到该子系统时,没有其他人可以访问。你也可以使用信号量来实现此目的。互斥锁是a"Mutual Exclusion Semaphore"。

#3 热门回答(37 赞)

互斥基本上是互斥的。只有一个线程可以一次获取资源。当一个线程获取资源时,在拥有资源的线程释放之前,不允许其他线程获取资源。等待获取资源的所有线程都将被阻止。

信号量用于控制执行的线程数。将有固定的资源集。每当线程拥有相同的资源时,资源计数就会减少。当信号量计数达到0时,则不允许其他线程获取资源。线程被阻塞,直到其他线程拥有资源释放。

简而言之,主要区别在于允许多个线程一次获取资源?

Mutex - 一个。

信号量 - 它的DEFINED_COUNT,(与信号量一样多)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值