public class Book { private static Book book = new Book(); private Book() {} public static Book getInstance() { if ( book == null) {
book = new Book();
} return book;
}
}
public class Book { private static final Book book = new Book(); private Book() {} public static Book getInstance() { return book;
}
}
第三种,延迟加载(线程不安全,假如有多个同时发现是空的,会创建出好多实例)
public class Book { private static Book book; private Book() {} public static Book getInstance() { if ( book == null) {
book = new Book();
} return book;
}
}
第四种,添加线程安全功能,加一个关键字就可以
public class Book { private static Book book; private Book() {} public static synchronized Book getInstance() { if ( book == null) {
book = new Book();
} return book;
}
}
这个方法在多线程下的工作表现很出色
第五种,规避不需要的同步,因为上面的同步范围太大,有点浪费性能,在引用有指向的时候,是不需要同步的 public class Book { private static Book book; private Book() {} public static synchronized Book getInstance() { if ( book == null) { synchronized (Book. class) {
book = new Book();
}
} return book;
}
}
第六种,静态内部类
public class Book { private Book() {} public static synchronized Book getInstance() { return BookHolder. book;
} private static class BookHolder { private static final Book book = new Book();
}
}
第七种,枚举单例
public class Book { private Book(){} public static Book getInstance() { return BookEnum. BOOK.getInstance();
}
private static enum BookEnum { BOOK; private Book book; private BookEnum() { book = new Book();
} public Book getInstance() { return book;
}
}
}
最优,但是枚举这个东西可读性不高