GW Blog

Never stop thinking, never stop moving.

Java多线程 ThreadLocal源码解析

分析ThreadLocal和其内部类ThreadLocalMap的实现原理

ThreadLocal是作为key值存储在ThreadLocalMap里面的,而ThreadLocalMap是一个典型的hash表,它的实例存储在了Thread.threadLocals,并且由于并非所有线程实例都需要用到threadLocals,它是懒汉式的初始化,在第一次插入时才会初始化创建ThreadLocalMap实例。输入的value是一个泛型对象,它可以是Integer、Doub...

Java多线程——Thread Runnable源码解析

分析多线程启动方式Thread和Runnable的实现原理

Java多线程的两种实现方法大家都应该知道了:继承Thread的子类实例化和实现Runnable接口用这个接口实现类去创建Thread实例。 Java的线程在Linux平台上使用的是NPTL机制,JVM线程跟内核轻量线程(LWP)一一对应。KLT是内核线程,它提供轻量进程给程序使用,调度由操作系统内核完成,所以Java程序无法在多个线程就绪状态下预测哪个线程会获得CPU调度。 在JV...

Java多线程——ConcurrentHashMap源码解析

分析并发集合类ConcurrentHashMap的实现原理

在之前讨论HashMap与HashTable时提到过,HashMap没有任何关于线程安全的处理,所以它不适合线程不安全的场景,而HashTable所有的操作方法都是加锁的,所以它是线程安全的,但是由于HashTable的一些设计上的缺陷比如每一次put或者get操作都需要重新对hash值取模来计算它的位置所以效率低。我们可以在多线程环境下通过对调用HashMap的方法进行加锁来确保其安全性,...

Java序列化 ObjectInputStream源码解析

分析序列化输入流ObjectInputStream的实现原理

上一篇讲了类的序列化,今天要讲类的反序列化,ObjectInputStream。 从内部变量中我们可以看出,内部包含一个块输入流,因为有handle机制所以也有一个内部缓存表但不是hash表 /** 处理数据块转换的过滤流 */ private final BlockDataInputStream bin; /** 确认调用返回列表 */ private ...

Java序列化 ObjectOutputStream源码解析

分析序列化输出流ObjectOutputStream的实现原理

概述 众所周知,Java原生的序列化方法可以分为两种: 实现Serializable接口 实现Externalizable接口 其实还有一种,可以完全自己实现转为二进制内容,用Unsafe写到内存里面,然后写入文件 Serializable 可以使用ObjectStream默认实现的writeObject和readObject方法并且可以通过transit关键字来使得变...

Java PipedInputStream PipedOutputStream类源码解析

分析管道字节流PipedInputStream和PipedOutputStream的实现原理

管道流主要是用于不同线程间的数据交互,可以通过一个PipedInputStream和一个PipedOutputStream相互连接来进行通信,从PipedOutputStream写入字节到PipedInputStream中,所以PipedOutputStream是writer端,PipedInputStream是reader端。 一个PipedInputStream只能与一个PipedOu...

Java BufferedReader BufferedWriter类源码解析

分析缓冲字符流BufferedReader和BufferedWriter的实现原理

BufferedReader 像BufferedInputStream为FileInputStream提供了缓冲区一样,BufferedReader为InputStreamReader提供了缓冲区。一般情况下,所有的读取都是先从下层输入流读取到缓冲区,然后再从缓冲区读取到目标数组,除非出现要读取的长度超过了缓冲区大小且缓冲区没有有效数据和有效mark,可以直接从下层输入流读取字符。 来看...

Java BufferedInputStream BufferedOutputStream类源码解析

分析缓冲字节流BufferedInputStream和BufferedOutputStream的实现原理

BufferedInputStream ​ BufferedInputStream是一个缓冲输入流,继承的是FilterInputStream。FilterInputStream包含了另一个InputStream作为它的基础数据源,并且FilterInputStream重写了InputStream的所有方法。作为FilterInputStream需要重写其中的部分方法,如果没有重写的话默认...

Java FileWriter OutputStreamWriter类源码解析

分析字符输出流FileWriter和OutputStreamWriter的实现原理

FileWriter 因为篇幅原因,上一篇直接了字符输入流,今天来分析一下跟FileReader相对应的字符输出流FileWriter。FileWriter是将字符写入文件的通用类,构造函数假定使用默认的字符编码和默认的字节缓冲区大小8K是使用者可以接受的,如果要指定这些值,需要通过一个FileOutputStream来构造FileWriter的父类OutputStreamWriter。 ...

Java FileReader InputStreamReader类源码解析

分析字符输入流FileReader和InputStreamReader的实现原理

FileReader 前面介绍FileInputStream的时候提到过,它是从文件读取字节,如果要从文件读取字符的话可以使用FileReader。FileReader是可以便利读取字符文件的类,构造器只能使用默认的字符集编码(系统的默认字符集)、默认的bytebuffer大小8KB。如果想要自己指定这些值的话,可以直接通过FileInputStream构造一个InputStreamRea...