版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33696779/article/details/69802633
方法一:懒汉式(懒汉式对于单线程而言,推荐使用,但是对于多线程,可能会出现 数据不同步,也可能会创建出好几个对象,因此不建议使用)
public class SingleModelTwo {
/**
* volatile 内存可见性(直接写入主存)、指令重排序
* synchronized 实现代码的原子性 上下文切换 (耗时) 保证内存可见性
*/
private static SingleModelTwo singleModelTwo=null;
private SingleModelTwo(){};
/**
* 线程不安全
* @return
*/
public static SingleModelTwo getInstance(){
if(singleModelTwo==null){
singleModelTwo=new SingleModelTwo();
}
return singleModelTwo;
}
}
方法二:显示锁(由于在方法前边加了显示锁,因此在调用这个方法是,因此在多线程同时调用改方法时,它时一遍一遍执行,不能达到并发,效率低下)
public class SingleModelTwo {
private static SingleModelTwo singleModelTwo=null;
private SingleModelTwo(){};
/**
* 线程安全 效率低下
* @return
*/
public static synchronized SingleModelTwo getInstanceTwo(){
if(singleModelTwo==null){
singleModelTwo=new SingleModelTwo();
}
return singleModelTwo;
}
方法三:双重检验锁(它在判断singleModelTwo为空之后加了显示锁,当该方法第一次执行完成之后,singleModel已经不为空,因此再次调用时,显示锁代码不被调用,所以效率相对方法二有所提高,推荐使用)
public class SingleModelTwo {
private static SingleModelTwo singleModelTwo=null;
private SingleModelTwo(){};
/**
* 线程安全 效率相对较低
* 双重检验锁
*/
public static SingleModelTwo getInstanceThree(){
if (singleModelTwo==null)
synchronized (SingleModelTwo.class){
if(singleModelTwo==null){
singleModelTwo=new SingleModelTwo();
}
}
return singleModelTwo;
}
}
方法四:饿汉式(它直接在类里边将对象实例化,速度快,这样在不加锁的情况下保证了线程安全,但是由于没有延缓机制,所以在多线程并发的情况下,可能会过度消耗JVM内存,使得运行效率变低。。。。。有时候在不使用改类对象时,而是用其他静态方法,这个时候实例化对象也是没有用的,只能增加JVM开销)
public class SingleModelOne {
//饿汉式
private static SingleModelOne singleModel=new SingleModelOne();
/**
* 构造器私有
*/
private SingleModelOne(){};
public static SingleModelOne getInstanceSingleModel(){
return singleModel;
}
}
方法五:静态内部类( 它是在饿汉式基础之上,增加静态内部类是现实延迟加载,保证JVM内存不被过度消耗,速度快, 推荐使用)
扫描二维码关注公众号,回复:
3747348 查看本文章
public class SingleModelThree {
/**
* 静态内部类
* @return
*/
public static SingleModelThree getInstance(){
return GetSingle.modelThree;
}
private SingleModelThree(){}
public static class GetSingle{
private static final SingleModelThree modelThree=new SingleModelThree();
}
}
注:最后在提一点,在网上看到有用枚举的,但是我觉得不是很常用,在此也没有做过多研究。
静态方法以及静态变量都是在类加载时被一起加载的,所以说有时候你用类对象第一次去调用静态方法,其他方法也会被架子啊