在阅读Java中的并发性时,我有以下疑问:
Java是否提供了较低级别的构造,然后同步进行同步?
在什么情况下我们会使用信号量而不是synchronized(在Java中提供监视器行为)
答案 0 :(得分:41)
Synchronized只允许一个执行线程同时访问资源。信号量允许最多 n (您可以选择n)执行线程同时访问资源。
答案 1 :(得分:8)
还有volatile
个关键字,根据http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html volatile
变量访问比通过同步代码访问这些变量更有效
java.util.concurrent.Semaphore
用于限制可以访问资源的线程数。也就是说,虽然synchronized
只允许一个线程获取锁并执行同步的块/方法,但信号量允许最多n个线程去阻止其他线程。
答案 2 :(得分:3)
还有atomics。这样就可以访问基本的硬件比较和交换命令,它是所有同步的基础。例如,它允许您安全地增加数字。如果++
是一个volatile字段,执行相同指令的另一个线程可以在线程写入之前读取该字段,然后在线程之后写回。所以一个增量就会丢失。 Atomics以“原子方式”进行读写操作,从而避免了这个问题。
实际上,volatile,synchronized语句,和原子会强制所有线程数据从主内存刷新和/或在适当的时候写入主内存,因此它们都不是 那个低级别。 (我在这里简化。与C#不同,Java并没有真正的“主存”概念。)