博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java复习11. 单例编程
阅读量:6906 次
发布时间:2019-06-27

本文共 1754 字,大约阅读时间需要 5 分钟。

Java复习11. 单例编程
1.
最简单的写法,那个方式是线程不安全的
public 
class 
Singleton {
    
private 
static 
Singleton 
instance
;
    
private 
Singleton(){}
    
public 
static 
Singleton getInstance(){
         
if
(
instance 
== 
null
){
             
instance 
= 
new 
Singleton();
        }
         
return 
instance 
;
    }
}
2.
因为上面的是线程不安全的,所以我们确保线程安全的方式使用 
synchronized
修饰 
getInstance
方法,这样的话确保了线程的安全,但是有问题,效率很低,大多数情况下此方法不需要同步,杀鸡用牛刀,有点过了
public 
class 
Singleton {
    
private 
static 
Singleton 
instance
;
    
private 
Singleton(){}
    
public 
static synchronized 
Singleton getInstance(){
         
if
(
instance 
== 
null
){
             
instance 
= 
new 
Singleton();
        }
         
return 
instance 
;
    }
}
3.
确保线程安全我们使用另一种方式,这一种方式在声明单例的时候,就已经将一个对象初始化好,但是不知道什么时候用,在程序启动的时候就初始化好了,增加的系统的负担和启动时间,效率不高。没有达到 
lazyloading
的效果。而且只允许一种方式调用实例。这种方式也是线程安全的,因为他是基于 
classLoad
机制的。
public 
class 
Singleton {
    
private 
static 
Singleton 
instance 
= 
new 
Singleton();
    
private 
Singleton(){}
    
public 
static 
Singleton getInstance(){
         
return 
instance 
;
    }
}
4.
静态内部类的实现方式
这一种方式同样是利用了 
classloader
的机制来保证初始化 
instance
时只有一个线程,但是区别上一种方式的是,这里起到了 
lazyloading
的效果,这里 
singleton
被状态的时候,, 
instance
没有被初始化。因为 
singletonholer
没有被主动地调用,,只有通过显示调用的方式,才会装在 
SingletonHolder class
 
进而才会初始化
instance
public 
class 
Singleton {
    
private 
static 
class 
SingletonHolder{
         
private 
static 
final 
Singleton 
INSTANCE 
= 
new 
Singleton();
    }
    
private 
Singleton(){}
    
public 
static 
final 
Singleton getInstance(){
         
return 
SingletonHolder.
INSTANCE
;
    }
}
5.
双重校验锁
public 
class 
Singleton {
    
private 
volatile 
static 
Singleton 
singleton
;
    
private 
Singleton(){}
    
public 
static 
Singleton getInstance(){
         
if
(
singleton 
  == 
null
){
             
synchronized
(Singleton.
class
){
                 
if
(
singleton 
== 
null
){
                     
singleton 
= 
new 
Singleton();
                }
            }
        }
         
return 
singleton 
;
    }
}
这种叫做双重校验锁机制,需要在 
jdk1.5
之后才可以。
最好的是使用双重校验锁的机制实现单例程序
 
YangTengfei
2013.11.23

转载于:https://www.cnblogs.com/hbhzsysutengfei/p/3438882.html

你可能感兴趣的文章
8.8
查看>>
http://www.cnblogs.com/kenshincui/p/3840294.html
查看>>
更改SQL SERVER默认端口
查看>>
ajax的traditional属性
查看>>
网络安全重点总结
查看>>
git &github 快速入门
查看>>
windows下mysql忘记root密码的解决方法
查看>>
hdu 1907 John / 2509 Be the Winner 博弈 最后取完者为输
查看>>
原来生活如此精彩
查看>>
〖Linux〗Ubuntu13.04 安装KCOPSE过程笔录
查看>>
C/C++ %s %d %u 基本概念与用法
查看>>
2012.7.18工作总结
查看>>
elasticsearch 2.4.0安装说明
查看>>
Java泛型:泛型的定义(类、接口、对象)、使用、继承
查看>>
正则表达式匹配
查看>>
C#向excel中写入数据的三种方式
查看>>
Python条件判断
查看>>
JavaScript学习总结(1)——JavaScript基础
查看>>
Java Web学习总结(12)——使用Session防止表单重复提交
查看>>
FMDB 使用方法
查看>>