聊聊ZooKeeper(一)分析ZooKeeper的Quorums机制--防止Split-Brain问题

使用过ZooKeeper的同学应该看到过一种说法,就是ZooKeeper集群中必须超过半数节点(Majority)可用,整个集群才能对外可用。这个说法在大多数情况下是正确的。这篇文章说说背后的原因。 实际上ZooKeeper提供了几种方式来认定整个集群是否可用,Majority只是其中的一种。...

2014-11-17 17:23:30

阅读数 6574

评论数 0

聊聊高并发(三十二)实现一个基于链表的无锁Set集合

Set表示一种没有重复元素的集合类,在JDK里面有HashSet的实现,底层是基于HashMap来实现的。这里实现一个简化版本的Set,有以下约束: 1. 基于链表实现,链表节点按照对象的hashCode()顺序由小到大从Head到Tail排列。 2. 假设对象的hashCode()是唯一的,...

2014-11-14 10:51:54

阅读数 5957

评论数 1

聊聊高并发(三十一)解析java.util.concurrent各个组件(十三) 理解Exchanger交换器

这篇讲讲Exchanger交互器,它是一种比较特殊的两方(Two-Party)栅栏,可以理解成Exchanger是一个栅栏,两边一方是生产者,一方是消费者, 1. 生产者和消费者各自维护了一个容器,生产者往容器里生产东西,消费者从容器里消费东西。 2. 当生产者的容器是满的时候,它需要通过Exch...

2014-11-12 18:04:35

阅读数 2811

评论数 0

聊聊高并发(三十)解析java.util.concurrent各个组件(十二) 理解CyclicBarrier栅栏

这篇讲讲CyclicBarrier栅栏,从它的名字可以看出,它是可循环使用的。它的功能和CountDownLatch类似,也是让一组线程等待,然后一起开始往下执行。但是两者还是有几个区别 1. 等待的对象不同。CountDownLatch的一组线程等待的是一个事件,或者说是一个计数器归0的事件。...

2014-11-12 14:00:10

阅读数 3865

评论数 0

聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和主要的方法,显示了如何实现的锁降级。但是下面几个问题没说清楚,这篇补充一下 1. 释放锁时的优先级问题,是让写锁先获得...

2014-11-12 10:38:18

阅读数 2931

评论数 0

聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁

这篇讲讲ReentrantReadWriteLock可重入读写锁,它不仅是读写锁的实现,并且支持可重入性。

2014-11-11 17:37:28

阅读数 3719

评论数 0

聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁

这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁。这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现。可重入锁的特点是: 1. 是互斥锁,基于AQS的互斥模式实现,也就是说同时只有一个线程进入临界区,唤醒下一个线程时也只能释...

2014-11-11 15:46:07

阅读数 3252

评论数 0

聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁

CountDownLatch闭锁也是基于AQS实现的一种同步器,它表示了“所有线程都等待,直到锁打开才继续执行”的含义。它和Semaphore的语意不同, Semaphore的获取和释放操作都会修改状态,都可能让自己或者其他线程立刻拿到锁。而闭锁的获取操作只判断状态是否为0,不修改状态本身,闭锁的...

2014-11-11 14:06:47

阅读数 3133

评论数 0

聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

前几篇分析了一下AQS的原理和实现,这篇拿Semaphore信号量做例子看看AQS实际是如何使用的。 Semaphore表示了一种可以同时有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据,只有拿到了票据的线程尽可以进入临界区,否则就等待,直到获得释放出的票据。Semaphor...

2014-11-11 11:15:38

阅读数 3418

评论数 0

聊聊高并发(二十四)解析java.util.concurrent各个组件(六) 深入理解AQS(四)

本来在这篇聊聊高并发(二十三)解析java.util.concurrent各个组件(五) 深入理解AQS(三) 中想结束AQS的话题, 但是最近在网上

2014-11-10 11:49:17

阅读数 4174

评论数 0

聊聊高并发(二十三)解析java.util.concurrent各个组件(五) 深入理解AQS(三)

这篇对AQS做一个总结。 上一篇帖了很多AQS的代码,可以看出AQS的实现思路很简单,就是提供了获取accquire和释放操作release,提供了 1. 可中断和不可中断的版本 2. 可定时和不可定时的版本 3. 独享和共享的版本 看过之前实现各种自旋锁系列的同学应该知道,在自旋锁的实现中...

2014-11-07 10:10:38

阅读数 3338

评论数 0

聊聊高并发(二十二)解析java.util.concurrent各个组件(四) 深入理解AQS(二)

上一篇介绍了AQS的基本两个内部类Node和ConditionObject的实现

2014-11-06 21:38:47

阅读数 4299

评论数 1

聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一)

AQS是AbstractQueuedSynchronizer的缩写,AQS是Java并包里大部分同步器的基础构件,利用AQS可以很方便的创建锁和同步器。它封装了一个状态,提供了一系列的获取和释放操作,这些获取和释放操作都是基于状态的。它的基本思想是由AQS负责管理同步器类中的状态,其他的同步器比如...

2014-11-06 14:16:49

阅读数 5678

评论数 0

聊聊序列化(二)使用sun.misc.Unsafe绕过new机制来创建Java对象

在序列化的问题域里面有一个常见的问题,就是反序列化时用何种方式来创建Java对象,因为反序列化的目的是把一段二进制流转化成一个对象。 在Java里面创建对象有几种方式: 1. 显式地调用new语句, 比如 DemoClass demo = new DemoClass() 2. 利用反射机制,...

2014-11-05 11:59:58

阅读数 4245

评论数 0

聊聊序列化(一)关于序列化协议的一些思考和问题

最近在设计一个RPC框架,需要处理序列化的问题。有很多种序列化协议可以选择,比如Java原生的序列化协议,Protobuf, Thrift, Hessian, Kryo等等,这里说的序列化协议专指Java的基于二进制的协议,不是基于XML, JSON这种格式的协议。在实际开发中考虑了很多点,也遇到...

2014-11-04 22:03:04

阅读数 5566

评论数 5

聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类

这篇说说java.util.concurrent.atomic包里的类,总共12个,网上有很多文章解析这几个类,这里挑些重点说说。 这12个类可以分为三组: 1. 普通类型的原子变量 2. 数组类型的原子变量 3. 域更新器 普通类型的原子变量的6个, 1. 其中AtomicBoole...

2014-11-04 10:49:05

阅读数 3491

评论数 0

聊聊高并发(十九)理解并发编程的几种"性" -- 可见性,有序性,原子性

这篇的主题本应该放在最初的几篇,讨论的是并发编程最基础的几个核心概念,但是这几个概念又牵扯到很多的实际技术,比如Java内存模型,各种锁的实现,volatile的实现,原子变量等等,每一个都可以展开写很多,尤其是Java内存模型,网上已经能够有很几篇不错的文章,暂时不想重复造轮子,这里推荐几篇Ja...

2014-11-03 21:43:16

阅读数 4413

评论数 0

聊聊高并发(十八)理解AtomicXXX.lazySet方法

看过java.util.concurrent.atomic包里面各个AtomicXXX类实现的同学应该见过lazySet方法,比如AtomicBoolean类的lazySet方法 public final void lazySet(boolean newValue) { int v...

2014-11-03 18:10:06

阅读数 6288

评论数 0

聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类

了解了并发编程中锁的基本原理之后,接下来看看Java是如何利用这些原理来实现各种锁,原子变量,同步组件的。在开始分析java.util.concurrent的源代码直接,首先要了解的就是sun.misc.Unsafe类,这个类可以说的java并发包的基础,基本上所有的组件都是依赖Unsafe来做底...

2014-11-03 16:14:23

阅读数 4272

评论数 0

聊聊高并发(十六)实现一个简单的可重入锁

可重入锁指的是如果一个线程已经获得了一个锁,那么它可以多次进入这个锁,当然前提是线程需要先获得这个锁。 可重入锁是最常使用的锁,Java的内置锁就是可重入锁,使用synchronized关键字可以启用内置锁机制,比如说一个类有两个synchronized方法A和B,在A方法中调用了B方法,如果锁...

2014-11-03 14:08:45

阅读数 4320

评论数 2

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