自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(4)
  • 收藏
  • 关注

原创 ReentrantLock与ConditionObject 管程模型的实现

背景在并发编程领域,有两个核心问题:一是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之前如何通信的问题。这两个问题通过监视器都可以解决。监视器的结构如下图所示:Java目前是提供了两个监视器的实现,一个是synchronized ,另一个是并发包下的ReentrantLock类。本文简要分析一下ReentrantLock是如何实现监视器模型?ReentrantLockReentrantLock实现了Lock接口,提供了加锁、解锁和创建条件等待队列的方法。结构上Reentra

2020-06-30 23:09:22 294

原创 PriorityQueue的堆排序算法实现

背景完全二叉树:只缺少最后一层靠右边节点的二叉树为完全二叉树。堆:特定排序规则下的完全二叉树。堆分为最大堆与最小堆,最小堆的特点就是父节点的值小于其子节点,最大堆的特点就是父节点的值大于其子节点。树这个逻辑结构可以用数组来存储,同理完全二叉树可以用数组来存储。由于完全二叉树这种逻辑结构决定了父子节点的数组下标存在函数关系,假设子节点数组下标为i,则父节点的数组下标为 (i-1) >>>1,这个可以简单证明出来,如下:证明:假设父节点位于树的第 n 层并距离n层第一个元素有m个

2020-06-29 21:31:31 455

原创 ConcurrentLinkedQueue非阻塞算法的实现

背景ConcurrentLinkedQueue 是一个并发安全的非阻塞队列。本质利用自旋CAS的方式来完成入队和出队的操作,但是走的不是一般的玩法。普通的非阻塞算法以下是我本人实现的利用自旋CAS来实现并发安全得入队和出队操作。设计思想是 每次出队后head指针指向队列头部,每次入队后tail指针指向队列尾部。这个实现简洁明了,但是无奈Doug Lea 觉得太辣鸡,他还想再优化一下…public class NonLockQueue<T> extends AbstractQueue&

2020-06-27 20:05:37 209

原创 LinkedBlockingQueue的双锁算法

背景LinkedBlockingQueue是JAVA并发包下的一个常用的线程安全的队列。这个队列挺有意思的,因为在没看它的源码之前,我以前它就是简单的用一把锁来控制队列的入队与出队。但实际它的设计更加巧妙,它用了两把锁来分别控制队列的入队与出队, 之为双锁算法。双锁算法要想实现入队和出队分别用两把锁来控制,那入队和出队操作的必须是不同的变量,否则会有线程安全问题。那又如何让入队和出队操作不同的变量呢?首先看一下常见的队列操作: /** * 队尾入队 * 当队列中没有元

2020-06-24 17:14:37 1282 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除