自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

软件开发与架构领域 -体系化知识分享

理清软件领域各种似是而非的概念,深刻理解本质

  • 博客(25)
  • 资源 (4)
  • 收藏
  • 关注

原创 Kafka源码深度解析-序列5 -Producer -RecordAccumulator队列分析

在Kafka源码分析-序列2中,我们提到了整个Producer client的架构图,如下所示:其它几个组件我们在前面都讲过了,今天讲述最后一个组件RecordAccumulator.Batch发送在以前的kafka client中,每条消息称为 “Message”,而在Java版client中,称之为”Record”,同时又因为有批量发送累积功能,所以称之为RecordAccumulator.Re

2016-09-29 18:21:44 5060

原创 Kafka源码深度解析-序列6 -Consumer -消费策略分析

从这一篇开始,我们将进入Consumer的分析。同Producer一样, Consumer也分旧的scala版和新的Java版,在此我们只分析新的Java版。有兴趣朋友可以关注公众号“架构之道与术”, 获取最新文章。 或扫描如下二维码: 在分析之前,我们先看一下, Consumer的基本用法: Properties props = new Properties(); ...

2016-09-25 17:19:40 15637 5

原创 Kafka源码深度解析-序列4 -Producer -network层核心原理

在上一篇我们分析了Java NIO的原理和使用方式,本篇将进一步分析Kafka client是如何基于NIO构建自己的network层。network层的分层架构下图展示了从最上层的KafkaProducer到最底层的Java NIO的构建层次关系: 图中淡紫色的方框表示接口或者抽象类,白色方框是具体实现。整个架构图也体现了“面向接口编程”的思想:最底层Java NIO往上层全部以接口形式暴露,上

2016-09-24 17:19:04 10019 6

原创 Kafka源码深度解析-序列3 -Producer -Java NIO

在上一篇我们分析了Metadata的更新机制,其中涉及到一个问题,就是Sender如何跟服务器通信,也就是网络层。同很多Java项目一样,Kafka client的网络层也是用的Java NIO,然后在上面做了一层封装。下面首先看一下,在Sender和服务器之间的部分: 可以看到,Kafka client基于Java NIO封装了一个网络层,这个网络层最上层的接口是KakfaClient。其层次关系

2016-09-23 11:59:31 8652 2

原创 Kafka源码深度解析-序列2 -Producer -Metadata的数据结构与读取、更新策略

在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述。从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列。我们的分析将从Producer端开始。从Kafka 0.8.2开始,发布了一套新的Java版的client api, KafkaProducer/KafkaConsumer,替代之前的scala版的api。本系列的分析将只针对这套Java版的api。

2016-09-22 14:09:50 19145 9

原创 Kafka源码深度解析-系列1 -消息队列的策略与语义

-Kafka关键概念介绍 -消息队列的各种策略与语义作为一个消息队列,Kafka在业界已经相当有名。相对传统的RabbitMq/ActiveMq,Kafka天生就是分布式的,支持数据的分片、复制以及集群的方便扩展。与此同时,Kafka是高可靠的、持久化的消息队列,并且这种可靠性没有以牺牲性能为前提。同时,在允许丢消息的业务场景下,Kafka可以以非ACK、异步的方式来运行,从而最大程度的提高性能。

2016-09-14 15:23:45 14669 5

原创 Java多线程 -- JUC包源码分析19 -- ForkJoinPool/ForkJoinTask

JDK 1.7 提供了一个并行计算的框架,本文就来分析一下它在使用和实现原理上,和ThreadPool有什么区别。何为Fork/Join?我们在大学算法课本上,学过的一种基本算法就是:分治。其基本思路就是:把一个大的任务分成若干个子任务,这些子任务分别计算,最后再Merge出最终结果。这个过程通常都会用到递归。而Fork/Join其实就是一种利用多线程来实现“分治算法”的并行框架。另外一方面,可以把

2016-09-12 23:10:17 2170

原创 Java多线程 -- JUC包源码分析18 -- ConcurrentSkipListMap(Set)/TreeMap(Set)/无锁链表

-为什么是SkipList,不是TreeMap的红黑树? -无锁链表的精髓 -ConcurrentSkipListMap -ConcurrentSkipListSet为什么是SkipList?大家都知道,在Java集合类中,有一个TreeMap,相对于HashMap,它的一个最大特点是:key是有序的。TreeMap的内部是用红黑树实现的。同HashMap一样,它也是非线程安全的。然后在JUC

2016-09-11 22:33:26 1315

原创 Java多线程 -- JUC包源码分析17 -- 弱一致性与无锁队列

–ConcurrentHashMap的弱一致性 –SynchronousQueue的弱一致性 –Exchanger的弱一致性 –Linux内核无锁队列的弱一致性 –总结经过前面一系列的源码分析,我们基本覆盖了JUC包的所有组件。在这诸多组件中,我们总是不断看到一个如影随行的东西:CAS。相当锁来讲,它的原子粒度更小,只是作用在一个基本变量上面(比如一个Integer, Long, 或者Ref

2016-09-11 17:35:04 1429

原创 Java多线程 -- JUC包源码分析16 -- Exchanger源码分析

上一篇所讲的SynchronousQueue,是2个线程之间单向的数据传输,一个put,一个take。 而今天所讲的Exchange,顾明思义,是双向的数据传输,2个线程在一个同步点,交换数据。其使用方式,大致如下:Exchange<String> exchange = new Exchange<String>(); //建1个多个线程共用的exchange对象//把exchange对象,传给4个

2016-09-11 17:30:05 1707

原创 Java多线程 -- JUC包源码分析15 -- SynchronousQueue与CachedThreadPool

在前面分析工具类Executors的时候,提到了CachedThreadPool:其线程数会无限增大,每来一个新请求,就会new一个Thread,其maxPoolSize = Integer.MAX。 其构造函数如下:public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor

2016-09-11 16:19:16 1918

原创 Java多线程 -- JUC包源码分析14 -- ScheduledThreadPoolExecutor与DelayQueue源码分析

DelayQueueScheduledThreadPoolExecutor

2016-09-10 20:28:16 1219

原创 Java多线程 -- JUC包源码分析13 -- Callable/FutureTask源码分析

关于Runnable,我们都已经很熟悉了。在上一篇,我们也分析了ThreadPoolExecutor用来执行任务的接口execute,如下所示:public interface Runnable { public abstract void run();}public void execute(Runnable command) { 。。。 }这里的execute(..)是没有返回值

2016-09-10 20:21:04 1602

原创 Java多线程 -- JUC包源码分析12 -- ThreadPoolExecutor源码分析

在JUC包中,线程池部分本身有很多组件,可以说是前面所分析的各种技术的一个综合应用。从本文开始,将综合前面的知识,逐个分析线程池的各个组件。 -Executor/Executors -ThreadPoolExecutor使用介绍 -ThreadPoolExecutor实现原理 –ThreadPoolExecutor的中断与优雅关闭 shutdown + awaitTermination –

2016-09-09 15:17:30 3227 3

原创 Java多线程 -- JUC包源码分析11 -- CyclicBarrier源码分析

在前面的篇章中,讲解了ReentrantLock + Condition,并讲述了2者结合的一个典型应用:ArrayBlockingQueue/LinkedBlockingQueue。今天讲述2者结合的另一个典型应用:CyclicBarrier。CyclicBarrier的概念要介绍CyclicBarrier这个概念,可以从下面这个比喻开始:一个小公司的所有人周六要出去团建,大家提前商定好周六早上

2016-09-08 23:19:23 1048

原创 Java多线程 -- JUC包源码分析10 -- ConcurrentLinkedQueue源码分析

在前面的篇章中,我们详细分析了AQS,并提到了里面一个关键数据结构:所有阻塞线程组成的一个等待队列,这个队列是用单向无锁链表实现的。今天所讲的ConcurrentLinkedQueue,其实现和AQS中的无锁队列基本一样。所以,如果你深刻理解了AQS,ConcurrentLinkedQueue也就知道了。出于内容的完整性,在此还是列一下其源码:public class ConcurrentLinke

2016-09-08 22:53:07 930

原创 Java多线程 -- JUC包源码分析9 -- AbstractQueuedSynchronizer深入分析-- Semaphore与CountDownLatch

在前面分析ReentrantLock/ReentrantReadWriteLock的时候,我们已经对AQS进行过分析。在初步了解了AQS之后,本篇试图对其进行一个更为系统性的分析。因为AQS是为整个同步框架的基石,不光是锁,很多其他同步组件,比如Semaphore, CountDownLatch,也都是建立在AQS之上。 -AQS–同步框架的基石 -AQS的3个核心技术原理 –AQS源码解析

2016-09-07 23:51:04 1714

原创 Java多线程 -- JUC包源码分析8 -- 对happen before的深刻理解

说到happen before,很多人都知道。但因为其理论的抽象,以及在语义上的微妙,使得对happen before的理解,往往陷入“隔靴搔痒“的境地。本文试图宏观性、多角度的来分析围绕happen before的诸多问题,从而搞清楚我们为什么需要happen before?-可见性 -重排序 -happen before -共享存储模型 vs. 消息模型可见性说到可见性,很多人立马会想到v

2016-09-06 12:03:39 1368

原创 Java多线程 -- JUC包源码分析7 -- 对Interrupt的深刻理解

在前面的源码分析中,很多地方用到了Interrupt,在此,对Interrupt做一个深刻总结。一、“中断“这个词有误区,它并不是真的中断一个线程,准备说,应该叫做“中断轻量级阻塞”。什么叫“轻量级阻塞”呢? 就是调用以下这几个函数,所造成的线程阻塞。此时线程是处于Waiting状态,会响应t.interrupt。响应方式,前4个,是直接抛出InterruptException异常,最后1个,是

2016-09-05 23:57:12 1145

原创 Java多线程 -- JUC包源码分析6 -- ConcurrentHashMap

ConcurrentHashMap的源码,从JDK1.6到JDK1.7, 经历了不少变化。在JDK1.7中,好几个地方使用了sun.misc.Unsafe里面的函数,比如UNSAFE.putOrderedObject, UNSAFE.getObject..。对于这些函数的原理,笔者也不甚理解。为此,本文的讨论只针对JDK1.6。 -锁分离 -读不加锁,锁加锁 -弱一致性, happen b

2016-09-05 21:21:10 1447

原创 Java多线程 -- JUC包源码分析5 -- Condition/ArrayBlockingQueue/LinkedBlockingQueue/Deque/PriorityBlockingQueue

-await/signal/signalAll与wait/notify/notifyAll区别 -Condition源码分析 -各种BlockingQueue源码分析await,signal,signalAll以下代码,分别展示了wait/notify, 和Condition的await/signal的用法Object o = new Object();synchronized(o) /

2016-09-05 01:34:14 1965

原创 Java多线程 -- JUC包源码分析4 -- 各种锁与无锁

说到锁,想必很多人就会被如下的各种专业名词绕晕了。本文试图厘清关于锁的各种概念,从而对锁有一个全面而深入的理解。–自旋锁/阻塞锁 –独占锁(排它锁)/共享锁(读写锁) –公平锁/非公平锁 –偏向锁/非偏向锁 –可重入锁 –悲观锁/乐观锁 –ReentrantLock源码分析 –AbstractQueuedSynchronized(队列同步器) –源码分析 –ReentrantRead

2016-09-03 21:18:58 2597 2

原创 Java多线程 -- JUC包源码分析3-- volatile/final语义

-volatile应用1 – 内存可见性 – JMM内存模型 -volatile应用2 – 原子性 -volatile应用3 – 构造函数逸出/DCL问题(Double Checking Locking) -final应用1 – 避免构造函数重排序 -final应用2 – CopyOnWrite -atomic数组/volatile数组/final数组/ -指令重排序,happen be

2016-09-03 21:13:40 2003 1

原创 Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet

上1篇讲述了Java并发编程的第1个基本思想–CAS/乐观锁,这1篇接着讲述并发编程的第2个基本思想:CopyOnWrite - CopyOnWrite基本思想 - CopyOnWriteArrayList - CopyOnWriteArraySet - AtomicReference的一个应用 - 总结CopyOnWrite基本思想 CopyOnWrite, 顾名思义

2016-09-03 21:05:28 1788 1

原创 Java多线程 -- JUC包源码分析1 -- CAS/乐观锁

乐观锁思想乐观锁的几种具体实现Java CAS原子操作/AtomicInteger实现ABA问题/AtomicStampedReference实现Mysql 乐观锁实现Mysql MVCC总结乐观锁思想问题的提出: 当多个线程或客户端并发修改同1份数据时,不加锁,如何实现互斥访问?乐观锁基本思路: 给数据本身加一个版本号字段,读取和写入时都不加锁。数据读出来的时候,此时版本号

2016-09-03 17:04:32 2823 2

cocos2d-x多线程异步加载资源

项目中摘抄出来的代码,在LoadingLayer::onEnter()中,开了一个boost thread来加载资源

2014-08-08

最优化理论与算法-陈宝林著

关于最优化的国内很经典的一本书,网上很难找到

2008-12-20

自编用openGL实现3D分形树,分形山

大多数分形程序都是二维的,本人提供一个3DIFS分形树程序,以及分形山。 程序很简单,适合初学者.

2008-12-02

自编的VC实现俄罗斯方块

自已编写的用VC实现的俄罗斯方块,程序思路清晰,小而易懂

2008-12-02

空空如也

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

TA关注的人

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