从 JDK5 开始,java 使用新的 JSR -133 内存模型(本文除非特别说明,针对的都是 JSR- 133 内存模型) JSR-133 提出了 happens-before 的概念,通过这个概念来阐述操作之间的内存可见性。如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在 happens-before 关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。 与程序员密切相关的 happens-before 规则如下:
深入理解 Java 内存模型(一)——基础 jsr133 [Java 并发编程实战]
@ThreadSafe
public class Resource {
private static Resource resource = new Resource();
public static getInstance() {
return resource;
}
}
@NotThreadSafe
public class Resource {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
resource = new Resource();
}
return resource;
}
}
@ThreadSafe
public class Resource {
private static Resource resource;
public synchronized static Resource getInstance() {
if (resource == null) {
resource = new Resource();
}
return resource;
}
}
@NotThreadSafe
public class Resource {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) { // first check
synchronized(Resource.class) {
if (resource == null) { // second check
resource = new Resource();
}
}
}
return resource;
}
}
@ThreadSafe
public class Resource {
private static class ResourceHolder {
private static Resource resource = new Resource();
public static Resource getResource() {
return resource;
}
}
public static getInstance() {
return ResourceHolder.getResource();
}
}