本文共 2165 字,大约阅读时间需要 7 分钟。
单例是整个生命周期只能有一个实例,开发中对于有的对象我们只允许他是唯一的就会使用 这种,避免其他的人可以创建实例
使用一些工具方法,用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。当你仅仅是提供一些方法时选用静态类,就比如util工具
维护状态信息,或者访问资源,选用单例模式。
1.饿汉式
(single单个单词记错了)package example.testForJava;public class SignalTest { //保证其他类中不能创建他的实例 private SignalTest() { } //在类初始化的时候就进行创建实例 private static SignalTest signalTest = new SignalTest(); public static SignalTest getInstance() { return signalTest; } private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
package example.testForJava;public class SignalTest2 { // SignalTest signalTest=new SignalTest();public static void main(String[] args) { SignalTest instance = SignalTest.getInstance(); instance.setName("qweqweq"); instance.setPassword("123123"); SignalTest signalTest=SignalTest.getInstance(); System.out.println( signalTest.getName());}}//从结果可以知道signalTest和instance实际上都是指向同一个对象
2.懒汉式
多线程线程安全package example.testForJava;public class SingleLazy { private static SingleLazy singlelazy; private SingleLazy() { } //bu使用synchronized修饰就会导致产生的对象不是同一个 public static synchronized SingleLazy getInstance() { try { if (null == singlelazy) { Thread.sleep(1000); singlelazy = new SingleLazy(); } } catch (InterruptedException e) { e.printStackTrace(); } return singlelazy; }}
package example.testForJava;public class singleLazy2 { public static void main(String[] args) { Thread[] threads=new Thread[10]; for (int i = 0; i < threads.length; i++) { threads[i]=new Thread2(); threads[i].start(); } }}class Thread2 extends Thread{ @Override public void run() { System.out.println(SingleLazy.getInstance().hashCode()); }}//经测试可以知道都是一个对象(hashcode相同)
转载地址:http://tqrwi.baihongyu.com/