java 生成 ticket_Java知识进阶-程序员必懂的自旋锁TicketLock原理-知识铺

原标题:Java知识进阶-程序员必懂的自旋锁TicketLock原理-知识铺

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

一、TicketLock 原理

内部维护的一个本地线程ThreadLocal变量,存放当前线程获取到的排队号。当获取服务的线程排队号和当前正在获取锁的线程服务排队号不相等时,就继续。

解决公平性: 解决之前普通CAS自旋锁(前面讲解过,手写一个自旋锁)等待线程会不停自旋,随机获取锁,导致先到的线程反而获取不到锁的公平性。

bee06c3eead2d475b83d46411a339fc0.png

cdf3a31f11d71bd8018b76ebdb833d47.png

关键点1:queNum.getAndIncrement()

这个函数调用的是compareAndSet操作,把排队号queNum加上1, 而自己获取到的还是未添加的0 刚好和curNum=0 是一样,这个时候线程就获取到了锁。

(注意:这里比较像mysql中的主键,自增型,insert后获取到的是当前ID,但是mysql的自增起点已经+1啦)

后面的线程拿到的排队号 都会自动加上+1 和curNum=0 就不相等了,while一直为true,就被上锁了。

关键点2: curNum.compareAndSet(myid, next);

这句是保准公平性的关键之处,也是重中之重。 当前线程在释放锁的时候,会把自己的ID+1,直接释放给它后面紧靠近它的线程。

关键点3: AtomicInteger

保准原子性关键之处,这里使用的是它的getAndIncrement函数,这个函数特点返回的是添加前的排队号,而又把后期的排队号给加上了1。

e2c25c68963abc2d9428d9c6fc9eca1e.png

关键点4: compareAndSet

compareAndSet 这个方法的实现如下:

e8b427d6f03ae5482610a1ff02706241.png

Unsafe 类 ,实现了CAS操作的C++类,从最底层保准了CAS操作。

二、 优缺点

优点: 公平性,解决了访问顺序问题。

缺点: 如果是cpu多核的服务器,在获取排队号的时候,必须从主存中读取,并阻止其他cpu修改。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列的自旋锁是通过设置特定的寄存器来实现的。在STM32F4中,可以使用内置的DWT(Data Watchpoint and Trace)模块来实现自旋锁。DWT模块可以用来监控程序执行时间,从而实现自旋锁。 在使用自旋锁之前,需要先初始化DWT模块。具体的初始化代码如下: ``` void spin_lock_init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } ``` 在上述代码中,首先将Core Debug模块使能,然后启用DWT模块的计数器。 接下来,可以使用以下代码来实现自旋锁的加锁和解锁操作: ``` void spin_lock(volatile uint32_t* lock) { while (__ldrex(lock) == 1); __strex(1, lock); } void spin_unlock(volatile uint32_t* lock) { __strex(0, lock); } ``` 在上述代码中,spin_lock函数会一直循环检查lock指向的变量是否为1,如果是1,则说明锁已经被其他线程占用,当前线程需要一直等待。如果lock指向的变量是0,则将其设置为1,表示当前线程占用了锁。 spin_unlock函数则是将lock指向的变量设置为0,表示当前线程释放了锁。 需要注意的是,自旋锁是一种非阻塞锁,如果其他线程一直占用锁,当前线程会一直循环等待,这会导致CPU占用率过高。因此,在使用自旋锁时,应该根据具体应用场景来选择合适的锁类型。同时,在STM32F4中,还可以使用信号量和互斥锁等更加高级的锁机制来解决多线程同步问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值