java 锁的种类以及辨析 (一):自旋锁:锁作为并发共享数据,保证一致性的工具,在 JAVA 平台有多种实现 (如 synchronized 和 ReentrantLock 等等) 。
这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析 JAVA 下常见的锁名称以及特性,为大家答疑解惑。
1、自旋锁
自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下
- 01publicclassSpinLock {
- 0203privateAtomicReference sign = newAtomicReference < >();
- 0405publicvoidlock() {
- 06Thread current = Thread.currentThread();
- 07while(!sign.compareAndSet(null, current)) {
- 08
- }
- 09
- }
- 1011publicvoidunlock() {
- 12Thread current = Thread.currentThread();
- 13sign.compareAndSet(current, null);
- 14
- }
- 15
- }
使用了 CAS 原子操作,lock 函数将 owner 设置为当前线程,并且预测原来的值为空。unlock 函数将 owner 设置为 null,并且预测值为当前线程。
当有第二个线程调用 lock 操作时由于 owner 值不为空,导致循环一直被执行,直至第一个线程调用 unlock 函数将 owner 设置为 null,第二个线程才能进入临界区。
由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用 CPU 时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。
注:该例子为非公平锁,获得锁的先后顺序,不会按照进入 lock 的先后顺序进行。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: