同步的Vs信号量

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

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

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

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

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

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

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

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