同步的Vs信号量

时间:2013-06-04 00:30:04

标签: java semaphore monitor synchronized

在阅读Java中的并发性时,我有以下疑问:

  1. Java是否提供了较低级别的构造,然后同步进行同步?

  2. 在什么情况下我们会使用信号量而不是synchronized(在Java中提供监视器行为)

3 个答案:

答案 0 :(得分:41)

Synchronized只允许一个执行线程同时访问资源。信号量允许最多 n (您可以选择n)执行线程同时访问资源。

答案 1 :(得分:8)

  1. 还有volatile个关键字,根据http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html volatile变量访问比通过同步代码访问这些变量更有效

  2. java.util.concurrent.Semaphore用于限制可以访问资源的线程数。也就是说,虽然synchronized只允许一个线程获取锁并执行同步的块/方法,但信号量允许最多n个线程去阻止其他线程。

答案 2 :(得分:3)

还有atomics。这样就可以访问基本的硬件比较和交换命令,它是所有同步的基础。例如,它允许您安全地增加数字。如果++是一个volatile字段,执行相同指令的另一个线程可以在线程写入之前读取该字段,然后在线程之后写回。所以一个增量就会丢失。 Atomics以“原子方式”进行读写操作,从而避免了这个问题。

实际上,volatile,synchronized语句,原子会强制所有线程数据从主内存刷新和/或在适当的时候写入主内存,因此它们都不是 那个低级别。 (我在这里简化。与C#不同,Java并没有真正的“主存”概念。)