• Java线程池、Executor原理分析

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)thread_pool1. 线程池作用与基本知识

    在开始之前,我们先来讨论下“线程池”这个概念。“线程池”,顾名思义就是一个线程缓存。它是一个或者多个线程的集合,用户可以把需要执行的任务简单地扔给线程池,而不用过多的纠结与执行的细节。那么线程池有哪些作用?或者说与直接用Thread相比,有什么优势?我简单总结了以下几点:

    • 1. 减小线程创建和销毁带来的消耗

    对于Java Thread的实现,我在前面的一篇blog中进行了分析。Java Thread与内核线程是1:1(Linux)的,再加上Thread在Java层与C++层都有不少成员数据,所以Java Thread其实是比较重的。创建和销毁一个Java Thread需要OS和JVM都做不少工作,因此如果将Java Thread缓存起来,可以实现一定的效率提升。

    • 2. 更加方便和透明的实现计算资源控制

    讨论这一条,可能需要举一些例子。以非常闻名的web服务器Nginx为例,Nginx以强大的并发能力和低资源消耗而著称。Nginx为了实现这些严格的要求,它严格地限定了工【查看更多】

  • JVM原理与实现——Reference

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

    duke_beer1. Reference的基本介绍

    reference的中文含义是“引用”。由于本文所基于的HotSpot虚拟机主要使用C++开发,因此我担心有人会把C++的引用和这里的reference混为一谈。所以,我会尽量使用reference(首字母小写)来表述”引用“这个概念。通常我们写下如下的语句: Object obj; 其实就是定义了一个reference。我可以很直白的说出一个结论——在32位机器上HotSpot的reference就是一个32bit的指针。如下图所示,reference指向一个堆空间的实际对象。这种常用的reference,我们给它起个名字——StrongReference。之所以这样叫,是为了体现它和其他Reference(即将登场)的联系与区别。

    image

    在java.lang.ref包下,有这样几个类:SoftReference、WeakReference以及Phan【查看更多】

  • JVM原理与实现——Synchronized关键字

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

    openJDK_gitar

    在多线程的Java程序中,Synchronized关键字是经常出现的。这篇文章里,我们就来研究一下它的实现原理。比如以下的示例程序:

    public class SynchronizedTest {
        int syncFunc() {
            synchronized(this) {
                int a = 0;
                return a;
            }
        }
    }
    

    对应的字节码如下:

    Compiled from "SynchronizedTest.java"
    public class SynchronizedTest {
      public SynchronizedTest();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      int syncFunc();
        Code:
           0: aload_0
           1: dup
    【查看更多】
  • JVM原理与实现——Thread

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

    Jaa

    前言

    之前研究OpenJDK的时候,并没有注意Java线程模型方面的东西。最近在学习一些Java并发方面的知识时,关于JVM线程实现原理的疑问又浮上心头。昨天晚上,突然想起以前研究OpenJDK的资料还在,于是开始在OpenJDK的源码里面研究Thread的实现。搞到凌晨三点多,差不多弄清楚了一个大概,这篇博文就主要把把相关的知识点记录下来。

    1. Java中Thread

    对于Java开发者来说,java.lang.Thread的确是再熟悉不过了。Java多线程程序都是通过它来实现功能的。有关Thread的使用方式,这里我不想赘述了,而是直奔Thread的实现原理。任【查看更多】

  • 使用RxJava遇到的问题

    本文出自:【InTheWorld的博客】

    timg

    越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。

    • 考虑主线程的切换

    RxJava中一个常用的使用方法是——在其他线程中做处理,然后切换到UI线程中去更新页面。其中,线程切换就是使用了observeOn()。后台下载文件,前台显示下载进度就可以使用这种方式完成。然而,实践发现这其中有坑。如果文件比较大,而下载包的粒度又比较小,这将导致很多通知积压下来,最终导致错误。

    这种错误其实也是可以理解的,毕竟MainLooper是根据Message来工作的,Message过多必然会导致一些问题。当然,这还是比较想当然的想法,最终还是需要… 【查看更多】

  • Java的序列化实现解析

    本文出自:【InTheWorld的博客】java_logo

    对于Java自带的对象序列化,我并没有仔细研究过它的实现机制。对于Java默认的序列化机制,它的最大优点就是简单方便。你需要做的仅仅是对需要序列化的POJO增加一句implement Serializable,最多最多再增加一行serialVersionUID。其他的事情就不用我们操心了。那么Java默认的序列化机制是如何实现的呢?答案就是——反射。

            Person person = new Person(25, "Tim");
            FileOutputStream fos = new FileOutputStream("Person.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(person);

    上面这段代码是典型的默认序列化使用方式。玄机就… 【查看更多】

  • 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<AndroidSchedulers> INSTANCE = new AtomicReference<>();
    【查看更多】
  • 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",
    【查看更多】
  • Java内存模型与volatile

    本文出自:【InTheWorld的博客】

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

    • Java内存模型

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

    1. 编译器优化:为了提升程序的执行
    【查看更多】