[笔记] Java 并发 – 对象的组合
更多情况下,我们希望的是将一些现有的线程安全的组件组合为更大规模的组件或者程序,并且在维护的时候不会无意中破坏类的安全性保证。
实例封闭
如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。
你可以确保该对象只由单个线程访问(线程封闭),或者通过一个锁来保护对该对象的所有访问。
一般情况下,我们将数据封装在对象的内部,并将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。…
更多情况下,我们希望的是将一些现有的线程安全的组件组合为更大规模的组件或者程序,并且在维护的时候不会无意中破坏类的安全性保证。
如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。
你可以确保该对象只由单个线程访问(线程封闭),或者通过一个锁来保护对该对象的所有访问。
一般情况下,我们将数据封装在对象的内部,并将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。…
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。
大多数竞态条件的本质——基于一种可能失效的观察结果来做出判断或者执行某个计算。这种类型的竞态条件称为“先检查后执行”。…
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。
Java 中每个类都有自己的 Class 对象,为了生成这个类的对象,JVM 会使用类加载器来完成这个操作。
所有的类都是在第一次使用的时候加载到 JVM 中的,也就是当程序创建第一个对类的静态成员的引用的时候,就会加载这个类。…
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…