June 04, 2017

深入学习FutureTask

第一部分:What

在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要的介绍使用方法,然后会从源代码角度分析下具体的实现原理。

本文以Java 1.7的代码进行分析。

第二部分:How

Callable接口

对于需要执行的任务需要实现Callable接口,Callable接口定义如下:

public interface Callable<V> ......

May 30, 2017

Java对象大小

一个Java对象的大小包括下面三个部分

1. 对象头(Header)

2. 实例数据(Instance Data)

3. 对齐填充(Padding)

对象头(Header)

对象头在32位系统上占用8bytes,在64位系统上占用16bytes。

实例数据(Instance data)

Java中原生类型(Primitive Type)的内存占用情况如下:

Primitive Type

Memory Required(bytes)

boolean

1

byte

1

short

2

char

2

int

4

long

8

float

4

d......

May 01, 2017

深入学习Java序列化

前言

对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化的底层实现,这篇文章算是这次的学习小结吧。

第一部分:What

Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。

那么为什么需要序列化呢?

第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。

第二种......