【发布时间】:2014-10-24 12:00:52
【问题描述】:
从概念上来说,
Mutex
Reader's/Writer lock (Better form of Mutex)
Semaphore
Condition Variable
被用作四种主要的同步机制,它们是纯粹基于锁的。对于这 4 种机制,不同的编程语言有不同的术语/行话。 POSIX pthread 包就是这种实现的一个例子。
前两个使用自旋锁(Busy-wait)实现。
最后两个使用睡眠锁实现。
基于锁的同步在 cpu 周期方面是昂贵的。
但是,我了解到java.util.concurrent 包不使用基于锁(睡眠/自旋)的机制来实现同步。
我的问题:
java并发包实现同步的机制是什么?因为自旋锁是 CPU 密集型的,而且由于频繁的上下文切换,睡眠锁比自旋锁更昂贵。
【问题讨论】:
-
最好缩小问题范围。然而,作为一个开放者,Java 可以使用监视器、信号量、等待/通知、内存屏障、自旋锁和 cas。这些技术中的每一种都至少在 JDK 库中的一个地方使用。我知道 Java 尚未使用的主要技术是 simd,但我相信该领域正在开展工作。
-
@ChrisK SIMD 实际上用于
Arrays.fill和类似操作的 JIT 编译器内部函数。 -
@ChrisK 这是我的信息来源:stackoverflow.com/a/21525039/1103872 似乎一些样板的for循环也被检测到并变成了内在的。
-
信号量和 RecursiveLocks 和 ReadWriteLocks 是锁。 .concurrent 包中的一些数据结构(例如,ConcurrentHashMap 和非阻塞队列)使用无锁算法,但任何可以阻塞直到其他线程执行必须正在使用的操作的方法调用某种锁。正如其他人已经指出的那样,“某种锁”可以通过 sun.misc.Unsafe 类使用本机调用来实现。
标签: java multithreading concurrency synchronization