自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2014-11-17 17:23:30 7776

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

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

2014-11-14 10:51:54 7398 1

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

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

2014-11-12 18:04:35 3064

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

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

2014-11-12 14:00:10 4267

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

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

2014-11-12 10:38:18 3190

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

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

2014-11-11 17:37:28 4220

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

这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁。这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现。可重入锁的特点是:1. 是互斥锁,基于AQS的互斥模式实现,也就是说同时只有一个线程进入临界区,唤醒下一个线程时也只能释放一个等待线程2. 可重入,通过设置了一个字段exclusiveOwnerThread来标示当前获

2014-11-11 15:46:07 3624

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

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

2014-11-11 14:06:47 3472

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

前几篇分析了一下AQS的原理和实现,这篇拿Semaphore信号量做例子看看AQS实际是如何使用的。Semaphore表示了一种可以同时有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据,只有拿到了票据的线程尽可以进入临界区,否则就等待,直到获得释放出的票据。Semaphore常用在资源池中来管理资源。当状态只有1个0两个值时,它退化成了一个互斥的同步器,类似锁。

2014-11-11 11:15:38 3899

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

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

2014-11-10 11:49:17 4615

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

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

2014-11-07 10:10:38 3768

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

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

2014-11-06 21:38:47 5151 2

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

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

2014-11-06 14:16:49 6550

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

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

2014-11-05 11:59:58 6001

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

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

2014-11-04 22:03:04 6450 5

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

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

2014-11-04 10:49:05 3937

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

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

2014-11-03 21:43:16 5916 1

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

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

2014-11-03 18:10:06 8579

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

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

2014-11-03 16:14:23 4985

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

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

2014-11-03 14:08:45 5079 2

原创 聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁)

读写锁是数据库中很常见的锁,又叫共享-排他锁,S锁和X锁。读写锁在大量读少量写的情况下有很高的效率优势。读写锁是基于普通的互斥锁构建出来的更复杂的锁,它有两个基本特点:1. 当任一线程持有读锁或写锁时,不允许其他线程再持有写锁2. 当任一线程持有写锁时,不允许其他线程再持有读锁也就是说,写锁是排他的,只要有一个线程持有写锁,就不允许其他线程再上锁。读锁是共享的,可以有多个线

2014-11-03 11:47:30 7719 8

聊聊锁的那些事

包括硬件,操作系统的一些核心概念 线程,进程的实现原理 锁的原理 各种自旋锁算法 Java synchronized内置锁的实现原理 Java并发包的多种同步工具类的实现原理

2015-09-22

深入理解Java内存模型

Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理

2015-09-22

数据系统实现

数据库原理的经典书籍,描述了数据库原理,对于想深入理解数据库的人员有很大的指导意义

2014-10-24

jsr133.pdf

Java内存模型JSR官方文档,定义了Java内存模型的概念模型涉及到的所有方面,对理解JMM有很大的帮助

2014-10-24

空空如也

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

TA关注的人

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