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