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