摘要:
在JDK1.5之前,也就是J.U.C加入JDK之前,Java是依靠synchronized关键字(JVM底层提供)来维护协调对共享字段的访问,保证对这些变量的独占访问权,并且以后其他线程忽的该锁时,将可以看到对这些变量进行的更改(可见性,互斥性)。 锁机制的问题: 锁问题不可回避的,就是上下文... 阅读全文
摘要:
前面已经介绍硬件平台Cache Coherence问题和解决办法,下面来看看Java虚拟机平台的相关知识。硬件平台处理器,高速缓存,主存之间的交互关系如下:Java内存模型(JMM) Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model, JMM)来屏蔽掉底... 阅读全文
摘要:
缓存(Cache) CPU的读/写(以及取指令)单元正常情况下甚至都不能直接访问内存——这是物理结构决定的;CPU都没有管脚直接连到内存。相反,CPU和一级缓存(L1 Cache)通讯,而一级缓存才能和内存通讯。大约二十年前,一级缓存可以直接和内存传输数据。如今,更多级别的缓存加入到设计中,一级... 阅读全文
摘要:
pipeline: 现在的CPU一般采用流水线方式来执行指令。一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段。然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐量。 流水线并不是串行的,并不会因为一个耗时很长的执行在"执行"阶段呆很长时间,而导致后续的... 阅读全文
摘要:
这里看一下原子数组操作和一些其他的原子操作。 AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择代表性的AtomicIntegerArray来描述这些问题。 int get(int i) //获得当前位置的值void... 阅读全文
摘要:
很多情况下我们只是需要简单的,高效,线程安全的递增递减方法。注意,这里有三个条件:简单,意味着程序员尽可能少的底层或者实现起来比较简单;高效,意味着耗用资源要少,程序处理速度要快; 线程安全也非常重要,这个在多线程下能保证数据的正确性。这三个条件看起来比较简单,但是实现起来却难以令人满意。 ... 阅读全文
摘要:
在了解JSON协议之前,朋友们可以先去了解一下JSON的基础知识,和ASCII基本分布,关于JSON一些常识请见这里; JSON(JavaScriptObjectNotation)是一种数据交换格式,是以JavaScript为基础的数据表示语言,是在以下两种数据结构的基础上来定义基本的数据描... 阅读全文
摘要:
通过直接继承Thread, 实现Runnable接口来创建线程。但这两种方式都有一种缺陷:在执行完任务之后无法获得执行结果。 如果需要获得执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来比较麻烦,而jdk中Callable和Future,通过他们可以在任务执行完毕... 阅读全文
摘要:
TCompactProtocol协议作为TBinaryProtocol协议的升级强化版,都作为二进制编码传输方式,采用了一种乐器MIDI文件的编码方法(wiki,百度下),简单介绍下两种思想: 1: ZigZag有符号数编码,如表格所示: 编码前编码后00-1112-2324-35 其效果等... 阅读全文
摘要:
Java里面线程池顶级接口是Executor,但严格意义上讲Executor并不是一个线程池,而是一个线程执行工具,真正的线程池接口是ExecutorService.关系类图如下: 首先Executor的execute方法只是执行一个Runnable任务而已,当然从某种角度上讲最后的实现类... 阅读全文