mirror of
https://gitee.com/52itstyle/spring-boot-seckill.git
synced 2025-12-30 10:22:26 +00:00
:sparkles:微信抢红包过期失效实战案例
This commit is contained in:
@@ -32,12 +32,28 @@ public class RedPacketQueue {
|
||||
}
|
||||
/**
|
||||
* 生产入队
|
||||
* 1、执行加锁操作
|
||||
* 2、把元素添加到优先级队列中
|
||||
* 3、查看元素是否为队首
|
||||
* 4、如果是队首的话,设置leader为空,唤醒所有等待的队列
|
||||
* 5、释放锁
|
||||
*/
|
||||
public Boolean produce(RedPacketMessage message){
|
||||
return queue.add(message);
|
||||
}
|
||||
/**
|
||||
* 消费出队
|
||||
* 1、执行加锁操作
|
||||
* 2、取出优先级队列元素q的队首
|
||||
* 3、如果元素q的队首/队列为空,阻塞请求
|
||||
* 4、如果元素q的队首(first)不为空,获得这个元素的delay时间值
|
||||
* 5、如果first的延迟delay时间值为0的话,说明该元素已经到了可以使用的时间,调用poll方法弹出该元素,跳出方法
|
||||
* 6、如果first的延迟delay时间值不为0的话,释放元素first的引用,避免内存泄露
|
||||
* 7、判断leader元素是否为空,不为空的话阻塞当前线程
|
||||
* 8、如果leader元素为空的话,把当前线程赋值给leader元素,然后阻塞delay的时间,即等待队首到达可以出队的时间,在finally块中释放leader元素的引用
|
||||
* 9、循环执行从1~8的步骤
|
||||
* 10、如果leader为空并且优先级队列不为空的情况下(判断还有没有其他后续节点),调用signal通知其他的线程
|
||||
* 11、执行解锁操作
|
||||
*/
|
||||
public RedPacketMessage consume() throws InterruptedException {
|
||||
return queue.take();
|
||||
|
||||
Reference in New Issue
Block a user