Category Archives: Java

[笔记] Java 并发 – 基础构建模块

By | 16 7 月, 2018

同步容器类

同步容器类包括 Vector / Hashtable / … 这些同步的封装器类是由 Collections.synchronizedXxx 等工厂方法创建的。
这些类实现线程安全的方式是:把它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。

同步容器类的问题

同步容器类都是线程安全的,也就是说直接调用暴露的公共方法都是没有任何安全问题的。但问题出在复合操作上,常见的比如:…

[笔记] Java 并发 – 对象的组合

By | 28 6 月, 2018

更多情况下,我们希望的是将一些现有的线程安全的组件组合为更大规模的组件或者程序,并且在维护的时候不会无意中破坏类的安全性保证。

实例封闭

如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。
你可以确保该对象只由单个线程访问(线程封闭),或者通过一个锁来保护对该对象的所有访问。
一般情况下,我们将数据封装在对象的内部,并将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。…

[笔记] Java 并发 – 线程安全性 & 对象的共享

By | 18 6 月, 2018

线程安全性

当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

竞态条件 Race Condition

当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。
大多数竞态条件的本质——基于一种可能失效的观察结果来做出判断或者执行某个计算。这种类型的竞态条件称为“先检查后执行”。…

[笔记] Java 类型信息

By | 18 6 月, 2018

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。

Class 对象

Java 中每个类都有自己的 Class 对象,为了生成这个类的对象,JVM 会使用类加载器来完成这个操作。
所有的类都是在第一次使用的时候加载到 JVM 中的,也就是当程序创建第一个对类的静态成员的引用的时候,就会加载这个类。

[笔记] Java 泛型

By | 15 6 月, 2018

简单泛型

public class TwoTuple<A, B> {
    public final A first;
    public final B second;
    public TwoTuple(A a, B b) {
        this.first = a;
        this.second = b;
    }
    public String toString() {
        return "(" + first + ". " + second + ")";
    }
}

泛型接口

泛型除了应用于类之外,也可以用于接口,比如生成器(Generator)。Generator…

[笔记] Java 异常相关

By | 12 11 月, 2017

Java 异常层次结构

Error 类的异常为 Java 运行时的系统内部错误导致,如果发生了这种异常,能通知给用户做做善后工作就已经不错了,也无力回天。所以这种异常在开发时基本是无需关心,也不能抛出的。
Exception 分支下的 RuntimeException 和 IOException 是按两种规则来划分的:

  • 由程序错误导致的异常属于 RuntimeException,像错误的类型转换、数组越界、空指针之类的
  • 程序本身没有问题,但由于像

[笔记] Java 并发相关

By | 12 11 月, 2017

线程局部变量

当某个 class 不是线程安全的时候,那么可以通过 ThreadLocal 辅助类来让每个线程都构造自己的这个 class 的实例。
比如 SimpleDateFormat 不是线程安全的,那么可以使用如下方式:

public static final ThreadLocal dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));