Java锁机制 自旋锁(spinlock)剖析

Spinlock 介绍

线程通过 busy-wait-loop 方式来获取锁, 任何时刻只有一个线程能够获得锁, 其它线程忙等待知道获得锁。

应用场景

spinlock 不会有线程状态切换,所以响应更快。

使用spinlock时, 临界区要尽量短,不要有显示或隐式的系统调用。如读写文件等操作。
临界区:指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,当有线程进入临界区段时,其他线程或是进程必须等待
当存在大量线程,竞争激烈时,不适合使用自旋锁,因为每个线程都在在执行,占用CPU时间。

Java 实现自旋锁

本例子使用了CAS原子操作,非公平锁, 即获得锁的先后顺序,不会按照进入lock的先后顺序进行。

package concurrent.lock;

import java.util.concurrent.atomic.AtomicReference;

/**
 * 自旋锁
 * 非公平锁,CAS, 非可重入锁
 * @author Marshall
 * benfit:响应速度更快, 因为不切换线程状态
 * bad:线程数量达到一定量时, 性能下降
 */
public class SpinLock implements Lock{
    private AtomicReference<Thread> sign = new AtomicReference<Thread>();

    public void lock(){
        Thread current=Thread.currentThread();
        while(!sign.compareAndSet(null, current)){

        }
    }

    public void unlock(){
        Thread current=Thread.currentThread();
        sign.compareAndSet(current, null);
    }
}




  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值