
Java
文章平均质量分 80
PunWinger
这个作者很懒,什么都没留下…
展开
-
关于Java重载方法时的可用修饰符
之前在写代码的时候,由于g原创 2014-05-10 16:48:30 · 1776 阅读 · 0 评论 -
Exchanger源码剖析
Exchanger是一个针对线程可以结对交换元素的同步器。每条线程把某个对象作为参数调用exchange方法,与伙伴线程进行匹配,然后再函数返回的时接收伙伴的对象。另外,Exchanger内部实现采用的是无锁算法,能够大大提高多线程竞争下的吞吐量以及性能。算法实现 基本方法是维持一个“槽”(slot),这个槽是保持交换对象的结点的引用,同时也是一个等待填满的“洞”(hole)。如原创 2014-07-15 20:06:01 · 1448 阅读 · 0 评论 -
Semaphore实现源码剖析
Semaphore是一个计数的信号量。从概念上来说,信号量维持一组许可(permits)。acquire方法在必须的时候都会阻塞直到有一个许可可用,然后就会拿走这个许可。release方法添加一个许可,会有可能释放一个阻塞中的获取者(acquirer)。然而,Semaphore没有使用真实的许可对象,只是保持一个可用计数并且采取相应的行为。信号量一般用于限制可以访问一些(物理上或者逻辑上)的资原创 2014-07-16 11:59:34 · 1062 阅读 · 0 评论 -
Phaser实现源码剖析
在这里首先说明一下,由于Phaser在4.3代码里是存在,但并没有被开放出来供使用,但已经被本人大致研究了,因此也一并进行剖析。 Phaser是一个可以重复利用的同步栅栏,功能上与CyclicBarrier和CountDownLatch相似,不过提供更加灵活的用法。也就是说,Phaser的同步模型与它们差不多。一般运用的场景是一组线程希望同时到达某个执行点后(先到达的会被阻塞),执行一个原创 2014-07-19 17:55:41 · 1713 阅读 · 0 评论 -
java并发包源码剖析 - 序章
对比PC开发,由于移动平台的硬件性能有限,有关磁盘IO、网络连接以及数据库操作等操作都是更为耗时,以及用户对于手机相应速度要求更高等原因,因此耗时操作绝大部分都在多线程上运行。多线程并发在移动应用开发上有着极其重要的地位。 为了更好地理解并发,因此决定对java的整个并发包进行源码程度剖析。这里说明一下,由于Android版的java sdk虽然保证接口与java SE的JDK兼原创 2014-06-30 15:49:04 · 1219 阅读 · 0 评论 -
Hadoop高可用特性解析
HDFS采用的是fsimage + edits的存储方式,fsimage是某个时间的内存文件系统镜像,edits是修改操作,每个修改操作称为一个事务,有一个整形的事务id指定。checkpoint的时候就存储一次fsimage,同时可以删除之前的edits。另外edits切割为很多segement,不同的segment都包含一段修改操作记录,正在写入的segment的文件名有inprogress和原创 2016-11-20 21:12:57 · 1341 阅读 · 0 评论 -
AbstractQueuedSynchronizer实现源码解析(二)
在前面分析了独占模式获取锁和释放锁的流程,接下来将进行共享模式的获取锁和释放锁的分析。 这里说明一下,不同线程能够获取共享模式的锁,但此时如果有线程尝试获取独占模式的锁则会失败,同理,当单一线程获取来独占模式的锁之后,此时不允许任何线程获取共享模式的锁。 关于共享模式获取锁的实现,AQS内部的做法也是把一个标记位共享模式的结点添加到独占模式同一个等待队列中,然后释放的时候同样是原创 2014-07-01 16:20:46 · 882 阅读 · 0 评论 -
AbstractQueuedSynchronizer实现源码解析(三)
前两部分,已经剖析了独占模式和共享模式下的获取锁以及释放锁的过程,接下来就是AQS最后的一个实现部分,Condition的实现。 AQS框架在内部提供两一个ConditionObject类,给其它独占锁提供Condition支持。一个锁对象可以关联任意数目的条件对象,条件对象提供了await、signal和signalAll操作,还包括一些带有超时,interrupt的方法。Condit原创 2014-07-02 21:30:43 · 1114 阅读 · 0 评论 -
ReentrantLock实现源码剖析
作为一个可重入的独占锁,ReentrantLock与隐式监控锁synchronized有着相同的行为和语义,不过ReentrantLock有着更高的扩展性。简介 ReentrantLock由上一次成功获取锁,但还没有释放锁的线程所拥有。如果锁没有被任何线程所拥有,那么此时有线程调用lock方法则会成功获取锁并返回。另外,如果当前获取锁的线程再次调用lock方法,该方法会马上返原创 2014-07-03 17:59:18 · 968 阅读 · 0 评论 -
CountDownLatch & CyclicBarrier源码实现解析
CountDownLatch CountDownLatch允许一条或者多条线程等待直至其它线程完成以系列的操作的辅助同步器。 用一个指定的count值对CountDownLatch进行初始化。await方法会阻塞,直至因为调用countDown方法把当前的count降为0,在这以后,所有的等待线程会被释放,并且在这以后的await调用将会立即返回。这是一个一次性行为——co原创 2014-07-10 16:44:35 · 1254 阅读 · 0 评论 -
ReentrantReadWriteLock实现源码剖析
ReentrantReadWriteLock提供了一个读写锁的实现,并且有着ReentrantLock相似的语义。简介非公平策略 此模式下,读写锁获取的顺序是不确定的,服从于可重入的限制。不公平锁意味着持续的竞争可能会无限延迟一个或者更多的读线程或者写线程,但比公平锁有更高的吞吐量。公平策略 此模式下,线程竞争锁获取会使用一个大致精确的FIFO的策略。当前锁被释原创 2014-07-05 17:27:06 · 1305 阅读 · 0 评论 -
一个基于AbstractQueuedSynchronizer类的Java的Mutex类的实现
之前由于需要查看了ThreadPoolExecutor的实现,然后发现了内部的封装工作线程的Worker类继承自AbstractQueuedSynchronizer类,查了一下,发现这个类封装了典型的并发锁操作,是java并发库java.util.concurrent的基础(作者就是鼎鼎大名的Doug Lea大神),花了大约一天的时间看了AbstractQueuedSynchronizer的原原创 2014-04-25 17:41:51 · 1025 阅读 · 0 评论 -
Java调用重载方法(invokevirtual)和接口方法(invokeinterface)的解析
先开坑原创 2015-01-25 20:40:35 · 5560 阅读 · 1 评论 -
Hadoop的mapreduce.framework.name属性原理
配置Tez引擎时,只要我们把Tez的jars和配置文件路径添加进HADOOP_CLASSPATH里,然后通过设置mapred-site.xml文件的mapreduce.framework.name属性为yarn-tez,就可以替换默认的MR框架为tez引擎。 其中的奥妙在于使用了JDK6+的一个特性ServiceLoader类。其为JDK实现了一个依赖注入的机制。 Servic原创 2015-01-21 13:10:15 · 4740 阅读 · 0 评论 -
log4j之个人浅析
最近稍微大致地阅读了log4j的源码,毕竟这是Java开源日志框架里几乎最常用的一个实现。在大多数实际应用中,还需要诸如common-logging、slf4j等Facade模式日志框架对log4j进行封装,实际日志记录、输出等级、格式化等工作都是由log4j完成。本文把注意力集中在log4j身上,探讨一下这个开源日志框架的内部。特性 关于log4j的具体配置以及例子这里就不多说了,原创 2015-05-10 20:49:23 · 955 阅读 · 0 评论 -
Java泛型的一些限制
和C++泛型对比,Java泛型只是一种编译期间的擦拭机制。这是由于考虑到和以前的兼容而考虑的一种折中方案。在编译好的泛型代码里,编译期间已经把所有的泛型信息给擦拭掉,因此无法获得任何有关泛型参数类型的信息。因此List和List实际上是同一类型。 参考以下代码: //以下3个例子都无法通过编译 public void testGeneric(Object arg) {原创 2015-06-07 10:53:36 · 1418 阅读 · 0 评论 -
Hadoop的一个变长long编码剖析
Hadoop对于long、int (化成long进行编码)的编码设计了自己的一套编码方式,这是一个zero-compressed encoded的变长编码方式,有利于大大压缩冗余数据。具体算法其实很简单,具体来说有如下几点:1、对于-112 2、如果i大于0,则编码的第一个字节 b 范围在-113和-120之间,则 i 会有 (-112 - b)个字节,所以可以表示有1-8个字节;3、原创 2015-06-14 23:38:11 · 1104 阅读 · 0 评论 -
Java进程与父子进程的标准输出流关联导致线程卡死的故障
故障现象 Java调度系统创建PHP数据脚本后,并且获取其标准输出流,然后循环读取其标准输出流内容。此时PHP数据脚本执行时间过长,Java调度系统Process.destory()杀掉进程后,ps也无法找到对应PHP数据脚本,但Java的线程却无法退出,依然卡死在读取标准输出流。曾经怀疑是kill无法清理干净进程,于是变为强制执行kill -9杀掉超时的PHP数据脚本,但情况依旧,Ja原创 2016-10-15 23:32:01 · 1800 阅读 · 0 评论 -
简单分析ThreadPoolExecutor实现的1.6版和1.7版之间的不同
ThreadPoolExecutor,相信在Android平台原创 2014-05-02 17:33:54 · 1260 阅读 · 0 评论