一、枚举类实现单例(线程最安全的一种,但是使用的比较少)

public enum InstanceTest {
     instance;
     public void test(){
         System.out.println("这是一个枚举类型的单例!");
     }
 }

二、静态内部类实现单例(线程安全的)

 public class InstanceTest {
     private InstanceTest(){}
     
     private static class single{
         private static final InstanceTest instance=new InstanceTest();
     }
     
     public InstanceTest getInstance(){
         return single.instance;
     }
 }

当类加载器加载该类时,静态内部类首先不会被加载,当调用getInstance方法时,由于要使用静态内部类的instance属性,此时才会去加载静态内部类,所以会延迟加载。

三、饿汉式单例

public class InstanceTest {
     private InstanceTest(){}
     
     private static InstanceTest instance=new InstanceTest();
     
     public static InstanceTest getInstance(){
         return instance;
     }
 }

线程安全的,该类第一次加载时就会创建一个实例,并发访问时一直是同一个实例所以是线程安全的,但实例的创建是依赖参数或者配置文件的,在getInstance()之前必须调用某个方法设置参数给它时该方式就行不通了。

 

四、懒汉式单例(线程不安全的)

public class InstanceTest {
     private InstanceTest(){}
     
     private static InstanceTest instance=null;
     
     public static InstanceTest getInstance(){
         return instance=new InstanceTest();
     }
 }

多个线程访问时,调用getInstance方法,可能创建不同的实例,所以不是线程安全的,加同步代码块的话会对性能有一定的影响。

双检锁式单例在java中存在问题,由于java的内存模型,java的内存模型存在无序写入问题

参考博客 http://blog.csdn.net/chenchaofuck1/article/details/51702129

posted on 2016-09-19 20:52  rising1234  阅读(650)  评论(1编辑  收藏  举报