WEB开发网
开发学院软件开发Java hand first 设计模式 - 单例模式 阅读

hand first 设计模式 - 单例模式

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示:单例模式 确保一个类只有一个实例,并提供一个全局访问点. Java代码publicclassTest{privatestaticTesttest=null;privateTest(){}publicstaticTestgetInstance(){if(test==null){test=newTest();}return

单例模式 确保一个类只有一个实例,并提供一个全局访问点.

Java代码   

public class Test { 
 
 private static Test test = null; 
 
 private Test() { 
 
 } 
 
 public static Test getInstance() { 
  
         if (test == null) { 
  test = new Test(); 
 } 
 return test; 
 } 
 
}

上面单例模式代码,采用延迟加载,在需要的时候再生成实例.但是多线程的情况可能会产生去多个实例.

Java代码   

      //多线程同时访问下面代码.会产生多个实例 
      public static Test getInstance() { 
    if (test == null) { 
  test = new Test(); 
 } 
 return test; 
 }

同步单例模式

Java代码   

public class Test { 
 
 private static Test test = null; 
 
 private Test() { 
 
 } 
 
 public synchronized static Test getInstance() { 
  
         if (test == null) { 
  test = new Test(); 
 } 
 return test; 
 } 
 
}

上面同步单例模式代码,可以防止多线程下产生多个实例,但是同步这个方法会让程序执行性能下降.

双重加锁单例模式

Java代码   

public class Test { 
     //volatile标示,多程线下变量不能同时修改 
 private volatile static Test test = null; 
 
 private Test() { 
 
 } 
 
 public static Test getInstance() { 
  //只有当实例不存在的时候,才执行同步代码块.生成实例.缩小同步范围提高性能 
          if (test == null) { 
  synchronized(Test.class){ 
  if(test==null){ 
   test = new Test(); 
  } 
  } 
 } 
 return test; 
 } 
 
}

急切实例化单例模式

Java代码  

public class Test { 
     //直接初始化静态变量 
 private static Test test = new Test(); 
 
 private Test() { 
 
 } 
 
 public static Test getInstance() { 
  
 return test; 
 } 
 
}

上面急切实例化单例模式,不同的类加载器,可能会产生多个实例.需要时指定类加载器.

Tags:hand first 设计模式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接