注:博客内容主要摘抄自参考阅读中的两篇博文~ 前言 最近在翻阅《阿里巴巴Java开发手册》时发现了这样一条【推荐】性的原则: // 使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分割符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。 String str = "a,b,c,,"; String[] ary = str.split(","); // 预期大于 3,结果是 3 System.out.println(ary.length); 比较好奇产生上述结果的原因,因此决定分析一波源码。 简介 split(String regex, int limit)一般根据正则表达式分割字符串,limit限定分割后产生的字符串个数,超过数量限制的情况下前 limit-1 个子字符串正常分割,最后一个子字符串包含剩下的所有字符。重载方法split(String regex)将 limit 设置为 0。 public String[] split 继续阅读 >>


董恒毅 19/01/20 20:40:14
2018年12月26日: ConcurrentHashMap的源码已经分析了不知多长时间,我真的很想吐槽(憋不住了),这东西是真尼玛的不好理解,总觉的分析这个东西没多大用处,但是已经开始了的事情,怎么能轻言放弃!最后再吐槽一下,ConcurrentHashMap你是真滴牛逼(这样下去非得掉头发不可)! 作者:championhengyi 发表于 2018/12/26 13:56:56 原文链接 https://blog.csdn.net/championhengyi/article/details/85260981 阅读:117 评论:2 查看评论 继续阅读 >>


董恒毅 18/12/26 13:56:56
新博客地址:H.Y’s BLOG。 CSDN有可能弃用,最后欢迎大家访问我的小站~ 作者:championhengyi 发表于 2018/12/08 18:41:56 原文链接 https://blog.csdn.net/championhengyi/article/details/84895991 阅读:69 评论:1 查看评论 继续阅读 >>


董恒毅 18/12/08 18:41:56
注:本篇博客主要内容来源于网络,侵删~ 引言 我们假设你已经熟练掌握了CAS,原子变量类等的相关概念。这篇博客中,我们主要讨论原子变量类的使用。 原子变量类 原子变量类共12个,分4组: 计数器:AtomicInteger,AtomicLong,AtomicBoolean,AtomicReference。 域更新器:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater。 数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。 复合变量:AtomicMarkableReference,AtomicStampedReference。 在每组中我会选择其中一个较有代表性的进行分析与举例。 AtomicReference 使用说明 AtomicReference的作用是对"对象"进行原子操作。 源码分析 public class AtomicR 继续阅读 >>


董恒毅 18/10/03 13:51:16
注:本篇博客部分内容引用自:Java并发编程:Lock 引言 在Java 5.0之前,协调对共享对象的访问可以使用到的机制只有synchronized和volatile。在Java 5.0之后,增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内置锁的方法,而是在内置锁不再适用的情况下,作为一种可选择的高级功能。 既生synchronized,何生Lock synchronized主要在功能上存在一些局限性。 如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。 再举个例子:当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。 如果采用synchronized关键字来实现 继续阅读 >>


董恒毅 18/09/27 15:46:50
为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05
结构化与非结构化网络 非结构化的P2P网络是指网络节点之间不存在组织关系,节点之间完全是对等的,比如第一代P2P网络Napster。 结构化的P2P网络与非结构化恰好相反,我们认为网络在逻辑上存在一个人为设计的结构,比如Chord假定网络是一个环,Kadelima则假定为一颗二叉树。有了这些逻辑结构,就给我们资源查找引入了更多的算法和思路。 引言 我们在 计算机网络–详解P2P对等网络(一)—BitTorrent协议 这一篇博客中讲述了BT下载的过程:在对等用户拿到种子文件的时候,首先会联系tracker服务器,然后加入用户集群,并在用户集群中寻找自己所需的内容,最后与拥有内容的对等用户进行联系。 从BT下载的过程中引出本节所要讨论的问题:如何高效的从用户集群中找出哪些对等用户拥有你正在寻求的具体内容? 在历史中有三种比较典型的模型来解决这个问题: Napster:使用一个中心服务器接收所有的查询,服务器告知去哪下载其所需要的数据。存在的问题是中心服务器单点失效导致整个网络瘫痪。 继续阅读 >>


董恒毅 18/06/28 21:24:59
注:本篇博客只是讲述了一致性哈希的思想,我们会在之后讲述分布式哈希表以及一致性哈希的一种实现(Chord算法)。 什么是一致性哈希算法? 引用自维基百科: 一致性哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位几乎需要对所有关键字进行重新映射。 总结:一致性哈希算法主要关注的是在分布式架构中,当节点数目发生变化的时候(增加/删除),怎样使再哈希的数据量最少。 一致性哈希的引出 在分布式系统中,节点的宕机、某个节点加入或者移出集群是常事。对于分布式存储而言,假设存储集群中有10台机器(node),如果采用传统Hash方式对数据分片(item)(即数据根据哈希函数映射到某台机器上存储),哈希函数应该是这样的:hash(item) % 10。根据上面的介绍,当node数发生变化(增加、移除)后,数据会被重新“打散”,导致大部分数据不能落到原 继续阅读 >>


董恒毅 18/06/26 21:06:58
一致性哈希的原理: 作者:championhengyi 发表于 2018/06/26 11:12:58 原文链接 https://blog.csdn.net/championhengyi/article/details/80812517 阅读:10 继续阅读 >>


董恒毅 18/06/26 11:12:58
注:本篇文章内容借鉴自:浅入浅出BitTorrent协议,其中加入了博主的部分原创,感谢,侵删~ 对等网络的概念 以下定义主要摘抄自维基百科与中科院计算技术研究所: 对等式网络(peer-to-peer,简称P2P),又称点对点技术,是无中心服务器、依靠用户群(peers)交换信息的互联网体系。它的作用在于,网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容,能被其它对等节点(Peer)直接访问而无需经过中间实体,减低以往网路传输中的节点,以降低资料遗失的风险。与有中心服务器的中央网络系统不同,对等网络中的每个用户端既是资源(服务和内容)提供者(Server),又是资源获取者(Client),任何一个节点无法直接找到其他节点,必须依靠其用户群进行信息交流。 对等网络的模型 P2P网络的简易模型图如下: 如图,我们可以总结出P2P网络的一些特征: 非中心化:P2P是全分布式系统,网络中的资源和服务 继续阅读 >>


董恒毅 18/06/21 11:15:10