• NDK开发的入门级总结

    本文出自:【InTheWorld的博客】

    就在两天前,我对JNI或者NDK开发的了解基本都还处于Hello World水平。这两天花时间学习了一下,算是对NDK开发有了一些入门级的了解。所以我准备写这一篇博客,算是一个入门级的学习总结。鉴于目前的水平,这篇blog不会讨论到一些复杂的内容,仅仅是一些流程的理解和分析。


    • JNI和NDK的开发思路

    NDK听起来好像很神秘,但实质上就是Java调用C/C++代码的技术。考虑到JVM就是用C/C++写的,Java调用C/C++其实并没有本质上的难度。以前写过一篇关于Lua调用C扩展的博客,其实就和JNI的思路是差不多的,当然Java比Lua复杂的多。JNI本质上就是这种调用的支持接口,在展开这种支持接口的使用方法之前,先来探讨一下这种接口的实现思路。

    虽然JNI已经明确的定义了接口函数的设计标准,但具体的实现还是有很多门道的【查看更多】

  • RxAndroid解析

    本文出自:【InTheWorld的博客】

    首先说明,RxAndroid其实并不是一个大项目,它更接近于一个RxJava在Android平台的一个补丁。不过这个霸气的名字却容易让人感觉这个一个平行的大项目。其实RxJava在Android上特殊性主要体现在UI线程的切换上,因为Android不允许普通线程更新UI。所以,RxAndroid的主要功能其实就是实现了AndroidSchedulers的功能。对于AndroidSchedulers这个类而言,我们最熟悉的用法便是AndroidSchedulers.mainThread()这个方法了。

    public final class AndroidSchedulers {
        private static final AtomicReference INSTANCE = new AtomicReference();
        private final Scheduler
    【查看更多】
  • RxJava原理之Scheduler

    本文出自:【InTheWorld的博客】

    线程的切换是RxJava一个重要的特性,并行运算和指定线程运行都是基于这种特性的。 其中,RxJava使用Scheduler类来抽象执行体(线程或者线程池)。而指定Scheduler的方式有observeOn()和subscribeOn()这两种。本文的标题是关于Scheduler原理方面的,但是直接去看Scheduler的实现其实是一种比较笨的办法。因为Scheduler其实是一个功能类,从使用方式上研究是一种更容易的方式。所谓的使用方式其实就是observeOn()和subscribeOn()这两个方法了。

    • observeOn方法

    废话少说,还是先来看一个observeOn()方法的使用例子吧!

        public static void main(String[] args) {
            Observable.range(20, 5)
                .doOnEach(debug("number",
    【查看更多】
  • mDNS浅析及应用

    本文出自:【InTheWorld的博客】

    mDNS是multicast DNS,mDns实现了在局域网内的服务发现功能。mDNS协议应用非常广泛,其中苹果的Bonjour就是mDNS的一个实现,此外Android 4.1之后也加入了对mDNS协议的支持。那么不禁要问,mDNS是如何实现局域网内的服务发现功能的呢?其实答案就在问题中,multicast + DNS。

    mDNS协议基于多播网络技术,它工作于UDP的5353端口。mDNS选择多播作为其实现方式,是有一定原因的。首先 ,单播网络不适合用于局域网络的服务 ,因为单播是点对点的,而服务的信息却应该面向多个客户的。其次,广播也是有局限的,为了避免广播风暴,广播是不能穿越子网的。所以mDNS选择多播技术的主要原因是多播面向多客户端、以及子网穿越的特点。多播节省带宽的特性在局域网内其实意义不大。

    • JmDNS的使用与实现

    DNS的内容,我目前还掌握的不多,各种记录的含义并没有仔细了解。所以这里对DNS部分就不做过多的分析了,… 【查看更多】

  • 线程同步技术之RCU

    本文出自:【InTheWorld的博客】

    多核程序设计其实挺困难的,就拿RCU(Read-Copy-Update)技术来说,我现在已经不知道自己看《深入理解并行编程》的RCU多少次了。到现在为止,还是有一些东西没有完全理解。这篇blog算是对我所领会到的RCU知识的暂时性总结。

    • RCU背景

    从个人的理解来讲,RCU其实是对rwLock的一种优化。从不区分读写的粗粒度锁到读写锁,然后到RCU机制,这就体现着并行程序设计的不断演进。rwLock的思路是,多线程读取不存在同步问题,所以放宽了读取锁,提高了并发读取的效率。而RCU的思路是,维持临界区多个版本(完整的非中间版本),同时取消读取锁,这种优化将会进一步的提高读取效率。事实上,在多数的多线程应用场景上,读取频率都是远远大于改写频率的。特别是在Linux内核中,很多全局数据结构会被同时读取,其次数远高于写入次数。

    image

    Figure… 【查看更多】

  • Java内存模型与volatile

    本文出自:【InTheWorld的博客】

    关于内存模型的问题,我以前写过一篇关于硬件内存模型的博客(多核程序设计——存储模型)。这篇blog主要分析了完全存储定序与部分存储定序的硬件存储模型。总的来说,硬件千奇百怪,内存模型五花八本,完全掌握这些CPU的脾气其实是件非常困难的事。Java作为一种跨平台的语言,实现统一的内存模型是非常有必要的。尤其是在并行程序非常常见的今天,一个良好定义的内存模型可以平衡开发效率与运行效率之间的矛盾。

    • Java内存模型

    Java内存模型的目的是为了给编程人员提供一个标准的设计接口,那么Java内存模型需要处理的问题有哪些呢?首先,一切问题都起源于人们对运行性能的追求,没有这些优化也就不存在这些问题,然而这是不可能的。Java内存模型需要处理的问题就是“乱序问题”。乱序问题,一般有以下几种情况:

    1. 编译器优化:为了提升程序的执行
    【查看更多】
  • 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会【查看更多】