票据ticket实现方式java代码_自旋锁(Ticket,CLH,MCS)

目录

自旋锁(Spin lock)

自旋锁(spin lock)是一个典型的对临界资源的互斥手段,它的名称来源于它的特性。自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。由于自旋锁只不进行线程状态的改变,所以当线程竞争不激烈时,它的响应速度极快。自旋锁适用于锁保护的临界区很小的情况,如果线程之间竞争激烈,上下文切换将耗费大量资源,性能会明显下降。

代码简单实现

package aqs;

import java.util.concurrent.atomic.AtomicReference;

public class SpinLock {

//使用原子类来标识线程是否获取到了锁

private AtomicReference lockOwner = new AtomicReference();

public void lock() {

Thread currentThread = Thread.currentThread();

// 如果锁未被占用,则设置当前线程为锁的拥有者

while (!lockOwner.compareAndSet(null, currentThread)) {

}

}

public void unlock() {

Thread currentThread = Thread.currentThread();

// 只有锁的拥有者才能释放锁

lockOwner.compareAndSet(currentThread, null);

}

}

这是一个简单的自旋锁代码,compareAndSet保证了我们操作的原则性,可以将c它看做是对锁的获取,只有获取到锁才能继续进行以后的操作,否则将会一直循环检测锁是否被释放,不会阻塞当前线程。

这种自旋锁在多线程同时竞争锁时,并不能保证其公平性。而公平自选锁的三种常见形式就是Ticket CLH 和MCS。

Ticket Spinlock

Ticket就类似于现实中的排队叫号,锁拥有一个服务号,表示正在服务的线程,还有一个排队号;每个线程尝试获取锁之前先拿一个排队号,然后不断轮询锁的当前服务号是否是自己的排队号,如果是,则表示自己拥有了锁,不是则继续轮询。

代码简单实现

public class TicketSpinLock {

// 排队号

private AtomicInteger ticketNum = new AtomicInteger(

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值