/**
懒汉式
*线程安全,在进行类初始化的时候就实例化了
*
*/
class Instance0 {
private static Instance0 instance = new Instance0();;
private Instance0(){}
public static Instance0 getInstance() {
return instance;
}
}
/**
饿汉式
*线程不安全的单列模式
*
*/
class Instance1 {
private static Instance1 instance;
private Instance1(){}
public static Instance1 getInstance() {
if(instance == null) {
instance = new Instance1();
}
return instance;
}
}
/**
饿汉式
*线程安全的单列模式, 但是效率不佳.
因为所有的线程都需要同步等待获取单例对象
*
*/
class Instance2 {
private static Instance2 instance;
private Instance2(){}
public static synchronized Instance2 getInstance() {
if(instance == null) {
instance = new Instance2();
}
return instance;
}
}
/**
饿汉式
*线程安全的单列模式, 效率由于上面一种饿汉的方式.
因为所有的线程都需要同步等待获取单例对象
*
*/
class Instance3 {
private static Instance3 instance;
private Instance3(){}
public static Instance3 getInstance() {
if(instance == null) {
synchronized(Instance3.class) {
if(instance == null) {
instance = new Instance3();
}
}
}
return instance;
}
}
/**
静态类
*饿汉的方式来生成单例,在需要的时候才会进行实例化.
*JVM在创建新对象的时候主要经历三个步骤:
1.分配内存
2.构造函数内存初始化
3.将对象指向分配的内存地址
*JVM会针对字节码进行调优,其中一项调优便是跳转指令的执行顺序,如果1->3->2的顺序,上面的方式会出现在多线程访问的过程中可能会出现莫名的错误.
*
*/
class Instance4 {
private static class InstanceHolder {
private static final Instance4 instance = new Instance4();
private int a;
}
private Instance4(){}
public static Instance4 getInstance() {
return InstanceHolder.instance;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。