用到的时候再创建)
public
static
SingletonDemo03 getInstance(){
//提供一个对外开放的方法用来获取对象
//方法同步,调用效率低
if
(
instance==
null
){
//Single Checked
synchronized
(SingletonDemo03.
class
) {
if
(
instance==
null
){
//Double Checked
instance
=
new
SingletonDemo03();
}
}
}
return instance;
}
}
- 双重检测锁式总结:将同步内容放在了if内部,提高了执行的效率,不必每次调用对象时都进行同步,只有第一次才同步,创建了以后就没有必要了。
public
class
SingletonDemo04 {
private
static
class
singletonSlassInstance{
//静态内部类
private
static
final
SingletonDemo04 instance
=
new
SingletonDemo04();
public
static
SingletonDemo04 getInstance(){
return
singletonSlassInstance.instance
;
//通过静态内部类名来调用内部类中的成员
}
private
SingletonDemo04(){}
//构造器私有
}
- 静态内部类方式总结:外部类无static属性,不会像饿汉式那样立即加载对象,只有真正调用getInstance(),才会加载静态内部类,加载类时是线程安全的。instance是static final类型,保证了内存中只有这样一个实例存在,而且只被赋值一次,从而保证了线程安全性。兼并了高并发调用和延时加载的优势。而且调用效率高,并实现了延时加载。
-
枚举方式:
public
enum
SingletonDemo05 {
INSTANCE
;
//此元素本身就是单例对象
//添加自己需要的操作
public
void
singletonOperation(){
}
}
|