之单例模式

java反射(java.lang.reflect),

  1. 普普通通的饱汉式、饿汉式

    package org.bighead.test2;

    public class TestPrivate {
    private String str = “strPrivate”;
    private static final TestPrivate TESTPRIVATE = new TestPrivate();
    // 饱汉式、饿汉式
    private TestPrivate() {
    super();
    System.out.println(str);
    }

    public TestPrivate getInstance(){
    return TESTPRIVATE;
    }

    public void toPrint(){
    System.out.println(“私有构造-公开药方法–单实例”);
    }
    }

反射创设实例、调用方法(实例可访谈的)

package org.bighead.test2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class TestDefaultSub  {

 public static void main(String[] args) {
  Class<TestPrivate> clazz = TestPrivate.class;
  try {
   Constructor<?> constructor = clazz.getDeclaredConstructor();
   constructor.setAccessible(true);
   TestPrivate tp = (TestPrivate) constructor.newInstance();
   tp.toPrint();
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
  } catch (InstantiationException e1) {
   e1.printStackTrace();
  } catch (IllegalAccessException e1) {
   e1.printStackTrace();
  } catch (InvocationTargetException e1) {
   e1.printStackTrace();
  }
 }
}
  1. 并发也会影响  

1.
平日性的饱汉式、饿汉式 package org.bighead.test2;public class TestPrivate
{private String str = “strPrivate”;private static final Test…

原来的书文地址:

概念:
  java中单例情势是一种普及的设计情势,单例格局分三种:懒汉式单例、饿汉式单例、登记式单例二种。
  单例方式有弹指间特征:
  1、单例类只可以有二个实例。
  2、单例类必需本人团结创立自个儿的无可比拟实例。
  3、单例类必得给持有别的对象提供这一实例。
  单例格局确认保障某个类唯有四个实例,何况自行实例化并向整种类统提供那些实例。在微型Computer种类中,线程池、缓存、日志对象、对话框、打字与印刷机、显卡的驱动程序对象常被规划成单例。那几个应用都或多或少具有财富管理器的效率。每台计算机能够有好三个打字与印刷机,但不得不有一个Printer
Spooler,防止止三个打字与印刷作业並且输出到打印机中。每台Computer能够有多少通讯端口,系统应该聚集管理那么些通讯端口,以幸免一个通讯端口还要被多少个诉求同有的时候候调用。不问可见,选用单例格局正是为着幸免不等同状态,避免政出四头。

 

 

 

 

第一看叁个经文的单例完成。

[java] view
plaincopyprint?图片 1图片 2

  1. public class Singleton {  
  2.     private static Singleton uniqueInstance = null;  
  3.    
  4.     private Singleton() {  
  5.        // Exists only to defeat instantiation.  
  6.     }  
  7.    
  8.     public static Singleton getInstance() {  
  9.        if (uniqueInstance == null) {  
  10.            uniqueInstance = new Singleton();  
  11.        }  
  12.        return uniqueInstance;  
  13.     }  
  14.     // Other methods…  
  15. }  

 

Singleton通过将构造方法限定为private制止了类在外表被实例化,在同三个虚构机范围内,Singleton的不二法门实例只可以通过getInstance()方法访问。(事实上,通过Java反射机制是力所能致实例化构造方法为private的类的,那多数会使具有的Java单例达成失效。此难点在此间不做商量,姑且一叶障目地以为反射机制子虚乌有。)

不过上述实现未有设想线程安全难题。所谓线程安全部都是指:假诺你的代码所在的进度中有多少个线程在同期运转,而那个线程也许会同期运营这段代码。假若每趟运转结果和单线程运行的结果是一样的,而且其余的变量的值也和预期的是同样的,正是线程安全的。只怕说:八个类如故程序所提供的接口对于线程来讲是原子操作依然多个线程之间的切换不会招致该接口的实行结果存在二义性,也等于说我们不用思索共同的标题。显明以上落成并不满意线程安全的要求,在产出情形下很只怕出现多个Singleton实例。

 

[java] view
plaincopyprint?图片 3图片 4

  1. package jason.single;  
  2.   
  3. public class TestStream {  
  4.     String name = null;  
  5.   
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.   
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.   
  14.     private TestStream() {  
  15.     }  
  16.   
  17.     private static TestStream ts1 = null;  
  18.   
  19.     public static TestStream getTest() {  
  20.         if (ts1 == null) {  
  21.             ts1 = new TestStream();  
  22.         }  
  23.         return ts1;  
  24.     }  
  25.   
  26.     public void printInfo() {  
  27.         System.out.println(“the name is ” + name);  
  28.     }  
  29.   
  30. }  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注