26

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

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

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

4

3 回答 3

50

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

于 2013-06-04T03:34:08.980 回答
10
  1. 还有volatile关键字,根据http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html volatile访问变量比通过同步代码访问这些变量效率更高

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

于 2013-06-04T03:35:47.000 回答
3

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

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

于 2013-11-20T21:19:49.863 回答