摘要: [TOC] 1. 什么是Zookeeper Zookeeper是大数据生态圈中的重要组件,如果你做过相关开发的话,应该经常能看到它的身影。其由雅虎开源并成为Apache的顶级项目。用一句话对其进行定义就是:它是一套高吞吐的分布式协调系统。从中我们可以知道Zookeeper至少具有以下特点: 1.Zo 阅读全文
posted @ 2018-08-21 20:10 takumiCX 阅读(15656) 评论(2) 推荐(1) 编辑
摘要: [TOC] 1. 前言 如果你认真看过我前几天写的这篇博客 "自己动手构建无锁的并发容器(栈和队列)" 的队列部分,那么我要向你表示道歉。因为在实现队列的出队方法时我犯了一个低级错误:队列的出队方向是在队列头部,而我的实现是在队列尾部。尽管代码能够正确执行,但明显不符合队列规范。所以那部分代码写作" 阅读全文
posted @ 2018-08-18 14:32 takumiCX 阅读(3877) 评论(0) 推荐(2) 编辑
摘要: [TOC] 1. 前言 在 "自己动手构建无锁的并发容器(栈和队列)" 中我们基于CAS算法构建了自己的无锁队列,其底层实现是不带哨兵结点的双向链表。双向链表为当前结点保留了指向前驱结点的引用,这种特性有时很有用,比如ReentrentLock中线程被唤醒后会通过prev指针找到前驱结点,通过判断其 阅读全文
posted @ 2018-08-15 11:01 takumiCX 阅读(1641) 评论(0) 推荐(0) 编辑
摘要: 更新日志(2018年8月18日):这篇博客的队列部分犯了个低级错误:入队和出队在同在队列尾端进行。正确的实现方式见 "基于双向链表实现无锁队列的正确姿势(修正之前博客中的错误)" [TOC] 1.前言 并发容器是线程安全的容器。它在实现容器基本功能的前提下,还提供了并发控制能力,使得容器在被多线程并 阅读全文
posted @ 2018-08-11 09:05 takumiCX 阅读(2310) 评论(2) 推荐(1) 编辑
摘要: [TOC] 1.前言 在 "ReentrantLock(重入锁)功能详解和应用演示" 这篇文章里我们讲解并演示了ReentrantLock(重入锁)的各种功能,其中就谈到ReentrantLock可以有公平锁和非公平锁的不同实现,只要在构造它的时候传入不同的布尔值,继续跟进下源码我们就能发现,关键在 阅读全文
posted @ 2018-08-07 08:51 takumiCX 阅读(27006) 评论(21) 推荐(17) 编辑
摘要: [TOC] 1.从Spring容器的核心谈起 使用过Spring框架进行web开发的应该都知道,Spring的两大核心技术是IOC和AOP。而其中IOC又是AOP的支撑。IOC要求由容器来帮我们自动创建Bean实例并完成依赖注入。IOC容器的代码在实现时肯定不知道要创建哪些Bean,并且这些Bean 阅读全文
posted @ 2018-07-28 10:05 takumiCX 阅读(1989) 评论(0) 推荐(3) 编辑
摘要: 1.什么是注解 注解是java1.5引入的新特性,它是嵌入代码中的元数据信息,元数据是解释数据的数据。通俗的说,注解是解释代码的代码。这个定义强调了三点, 1.注解是代码 这意味着注解可以被程序读取并解析。它可以被编译器编译成class文件,也可以被JVM加载进内存在运行时进行解析。JDK中的"@O 阅读全文
posted @ 2018-07-23 21:30 takumiCX 阅读(2110) 评论(0) 推荐(3) 编辑
摘要: [TOC] 1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富 阅读全文
posted @ 2018-07-19 23:11 takumiCX 阅读(101457) 评论(14) 推荐(30) 编辑
摘要: [TOC] 1.LockSupport功能简介 在java并发包下各种同步组件的底层实现中,LockSupport的身影处处可见。JDK中的定义为用来创建锁和其他同步类的线程阻塞原语。 我们可以使用它来阻塞和唤醒线程,功能和wait,notify有些相似,但是LockSupport比起wait,no 阅读全文
posted @ 2018-07-18 12:14 takumiCX 阅读(13481) 评论(3) 推荐(1) 编辑
摘要: [TOC] 1. 从一次项目经历说起 在上家公司做spark的任务调度系统时,碰到过这么一个需求: 1.任务由一个线程执行,同时在执行过程中会创建多个线程执行子任务,子线程在执行子任务时又会创建子线程执行子任务的子任务。整个任务结构就像一棵高度为3的树。 2.每个任务在执行过程中会生成一个任务ID, 阅读全文
posted @ 2018-07-16 22:58 takumiCX 阅读(2349) 评论(1) 推荐(1) 编辑