Java 同步与信号量

Java 同步与信号量,java,semaphore,monitor,synchronized,Java,Semaphore,Monitor,Synchronized,在阅读Java中的并发性时,我有以下疑问: Java是否提供较低级别的构造,然后进行同步 在什么情况下,我们将使用信号量over synchronized(在Java中提供监视行为) 同步只允许一个执行线程同时访问资源。信号量允许最多n(您可以选择n个)执行线程同时访问资源 还有volatile关键字,根据volatile的说法,变量访问比通过同步代码访问这些变量更有效 java.util.concurrent.Semaphore用于限制可以访问资源的线程数。也就是说,虽然synchronize

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

  • Java是否提供较低级别的构造,然后进行同步

  • 在什么情况下,我们将使用信号量over synchronized(在Java中提供监视行为)


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

  • 还有
    volatile
    关键字,根据
    volatile
    的说法,变量访问比通过同步代码访问这些变量更有效

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

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


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

    synchronized提供了线程干扰和内存一致性错误的解决方案,而volatile只提供内存一致性错误的解决方案,因此我们无法使用volatile在操作中提供原子性,,我在这里遗漏了什么吗?volatile还提供了对long/double的原子访问。使用volatile,您可能仍然有脏读并损坏您的共享值。所以它不是同步的替代方案。我认为对于问题1,我们可以使用ReentrantLock和Condition对象,它们是一种较低级别的构造。。