• Java多线程同步实现

    本文出自:【InTheWorld的博客】

    说实话,我在准备探究Java线程同步的实现原理时,并没有听说过AbstractQueuedSynchronizer。所以作为一个昨天才第一次听说的自旋锁实现方式,AQS成功地吸引了我。AQS的实现基于CLH锁(Craig, Landin, and Hagersten Lock),这种数据结构的特点在于把“临界数据”和“进程控制”同时实现。相比于我以前看到的方法,这种实现明显更加高效和简洁。在Java concurrent库中,AQS是最重要的基础之一。

    • AbstractQueuedSynchronizer的原理

    一个同步线程工具大致要实现以下三个功能:

    1. 原子地管理同步状态
    2. 阻塞和唤醒线程
    3. 管理线程队列

    对于第一个功能,AQS使用了一个int型的字段来管理锁的状态。类似于物理硬件的compareAndSwap原子指令,Java【查看更多】

  • 基本线程同步总结(C与Java)

    本文出自:【InTheWorld的博客】

       《Posix多线程程序设计》是我读的第一本关于多线程程序设计的书籍。这本书生动且深刻地讲解了多线程程序设计的难点与Pthread库的使用方式,我从中收获颇丰。Pthread作为操作系统接口标准,直接用于应用层开发难免会让人感觉到有些单薄。Java对多线程程序设计模式进行了一定的封装,以方便大家的使用。然而在基础功能上,Java的多线程程序与Pthread其实非常相似,这也是这篇blog是使用这个标题的原因。

    • Mutex(Pthread) vs Lock/synchronized(Java)

        Mutex是Pthread提供的最基本的线程同步工具,Mutex的功能突出一个简单粗暴,类似于操作系统中的自旋锁(当然,Mutex会【查看更多】

  • RxJava设计原理解析<3>

    本文出自:【InTheWorld的博客】

        在上一篇blog中,我们主要讨论了一些关于map和flatMap实现方面的知识。但是flatMap远比map复杂,flatMap涉及了merge算子方面的东西。所以这篇博文将重点分析merge算子的实现原理。merge算子的功能是把多个Observable整合到一起,并创建一个新的Observable。听起来这个功能其实并不是很难理解,merge就像两江交汇一般,把各支流的水汇聚到一起。《Learning Reactive Programming》一书中有非常形象的配图。下图就描述了merge的功能:

    image

        从视觉上就能看得出来,merge与flatMap非常相似,而这也是flatMap底层使用merge实现的原因。一个例子让你明白flatMap的作用,代码如下。

         int
    【查看更多】
  • RxJava设计原理与解析<1>

    本文出自:【InTheWorld的博客】

    RxJava即Reactive Java,是响应式编程范式在Java上的一种实现。响应式编程范式的目标是,提高程序的容错性、降低软件模块的耦合性、提高程序相应速度。到目前为止,几乎所有主流语言都有相应的reactive库。其中,RxJava在android的开发中,应用的非常广泛。我使用RxJava也有一两个月了,期间断断续续的学习了RxJava。坦诚的说,刚开始的时候确实有点晕。首先,这种相应式的编程范式确实比较新颖,其次,我很好奇RxJava背后的实现原理,但一时间又想不通。既然想不通,我就打算看源码来分析,所以就有了这篇blog。

    • RxJava基本用法的实现

    这里所说的基本用法是指,只使用Observable、Observer,而不使用其他高阶运算符的用法。毕竟研究问题,还是由浅入深相对容易理解。首先研究下面这个例子:

            Observable<Integer>
    【查看更多】
  • Java Annotation——由butterknife想到

    butterknife是Android开发中应用非常广泛的一个库。butterknife库主要利用了Java中的注解功能,可以提高Android应用的开发效率,毕竟没几个人会喜欢写那种冗长乏味的页面布局、事件连接的代码。首先,还是给一个典型的butterknife使用代码:

        @BindView(R.id.btn)
        TextView mBtn;

    这两行代码,就实现了把布局文件与TextView连接起来的功能,看起来确实非常简单。那么这么方便的功能是如何实现的呢?首先,还是看一个简答的例子,代码如下:

    SimpleAnnotation.java
    package basicTest;
    import java.lang.annotation.*;
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    【查看更多】
  • Java的字符编码

    想到这个问题的缘由是如下这段代码:

        String inputStr = "abc";
        byte[] input = inputStr.getBytes();
        System.out.println(input.length);
    

    按照我的常识,Java的String类使用的是utf-16编码。在BMP平面的字符都是可以使用两个字节表示的,四个字节的情况并不常见。对于例子中的inputStr,它应该占用六个字节的存储空间。但是这段程序的执行结果是3。

    这是为什么呢?原来String类还有一个getBytes(String charset)方法。直接调用String.getBytes()相当于调用String.getBytes(Charset.getDefaultCharset())。在中文操作系统下,一般的默认编码都是GBK。

    首先需要明确的是,中文编码GB18030GBKGB2312ASCII,这里的大于号是兼容包含的含义。在三个中文编码标准中,除了128个ASCII是一个字节外,其他都是两个字节。所以中文编码严格算来也是变长编码格式。然而这些中文… 【查看更多】

  • Java解释器浅析

           解释器是Java虚拟机非常重要的一部分,它的工作就是把字节码转化为机器码并运行。Hotspot中实现了两种具体的解释器,分别是模板解释器而C++解释器。同时在Hotspot的源码树中还保留着一种“字节码解释器”的古老解释器。这种解释器没有编译优化,效率比较低,本质上就是一个比较长的switch语句,针对不同的字节码执行不同的操作。这些操作直接以C/C++语言的形式表现出来,随着项目的编译一起形成了“硬性的”机器代码。相比之下,模板解释器的工作要更为复杂一些,效率也会更高一些。 模板解释器的主要构成:1.解释器,读取字节码,一边翻译一遍执行;2.代码生成器:利用宏汇编器向代码缓存空间… 【查看更多】

  • Ubuntu 14.04编译OpenJDK

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

            中秋节前后的一段时间,我草草的研究了一下hotspot的源码,对JVM有了一点点了解。当时也翻了翻《HotSpot实战》,不过可惜的是一直没有动手编译调试过HotSpot,实在是汗颜。前几天虚拟机上装了个Ubuntu kylin,又觉得应该再尝试编译一下OpenJDK。然后就开始了蛋疼的过程,昨天晚上终于编译成功了,这里记录一下自己遇到的坑。

            网上有人说32位的不好装,但是机器是32的也没有什么办法。首先可能是编译环境的问题了,我的源码是openjdk-7u40-fcs-src-b43-26_aug_2013.zip【查看更多】

  • Java虚拟机Hotspot源码分析之找门

     本文出自:【InTheWorld的博客】 (欢迎留言、交流)

            最近研究JVM已然走火入魔了,下午看了两个小时,终于看出了一点端倪。像我这样Java学个半吊子,就开始研究JVM源码的人实在是奇葩的存在!源码据说有50多万行,不过感觉也不是很多的样子。大概是linux源码看多了,觉得这hotspot并不是很大(坐等被虐出翔)。先记录一下成果吧!
            首先,目录结构: 有os,cpu,os_cpu,share这几个目录,顾名思义,就是存放着不同特点的代码。os依赖的,cpu依赖的,共有的,还有os和cpu都依赖的。
            其实,东西最多的是share目录下的东西。毕竟C++也是可移植的嘛!我跑马观花的看了看《深入Java虚拟机》,发现这本书的重点集中在字节码什
    【查看更多】