欢迎来到知了汇智!
联系电话:知了汇智-电话号码 028-62016472 / 13228113191

分享java多线程之单例模式-知了汇智

分享java多线程之单例模式

  单例模式:

  单例模式是指在程序运行过程中,某个类在内存中只有一个对象,即让一个类只能创建一个对象,所以单例模式不能用new关键字创建

  单例模式一般分为两种情况,饿汉式和懒汉式

分享java多线程之单例模式

 

  创建单例模式的步骤:

  1构造方法私有化private,保证外部访问不到构造方法,否则可以创建无限多个对象,私有化构造方法后系统不再提供默认的构造方法

  2创建私有的private静态的static  当前对象类对象(饿汉式)/可见的volitale当前类对象的引用(懒汉式或延时加载)

  3对外提供公共的public静态的static访问方法,将单例对象暴漏给外部,让外部能访问到单例类的对象

  注意:2中成员变量要是私有的静态的,如果不是静态的,3中的静态方法访问不到这个成员变量.

  3中的公共方法必须要是静态的,才可以通过类名.方法名的方式调用该方法

  为了防止多线程调用懒汉式创建多个对象,懒汉式的访问方法要设置成同步的synchronized

  创建示例:

package chen_chapter_9;
 
public class SingleTest01 {
	public static void main(String[] args) {
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();
		System.out.println(s1 == s2);
 
		Slone s3 = Slone.getInstance();
		Slone s4 = Slone.getInstance();
		System.out.println(s3 == s4);
	}
 
}
//懒汉式
class Single {
	// 1私有化构造方法
	private Single() {
	}
 
	// 2创建当前单例类对象,因为是饿汉,所以先创建对象,为了不被外部访问,要私有化,且静态
	private static Single s = new Single();
 
	// 3提供给外部能访问的方法,返回该单例模式的对象,
           因为只能通过类名.方法的方式访问该方法,所以该方法要是静态的
	public static Single getInstance() {
		return s;
	}
}
 
 
//饿汉式
class Slone {
	// 1私有化构造方法
	private Slone() {
	}
 
	// 2创建单例类的引用,不能直接被外面访问,用private,对多线程可见,要用volitale关键字
	private static volatile Slone slone = null;
 
	// 3提供公共方法,以返回该单例对象
	public static synchronized Slone getInstance() {
		if (slone == null) {
			slone = new Slone();
		}
		return slone;
	}
}
out:
true
true两个对象的内存地址相同,说明是同一个对象

  java示例:

public class Runtime {
    private static final Runtime currentRuntime = new Runtime();
 
    public static Runtime getRuntime() {
        return currentRuntime;
    }
 
    /** Don't let anyone else instantiate this class */不能被任何人实例化
    private Runtime() {}
//该函数可以执行windows的一些命令如画图mspaint,关机shutdown, logoff注销命令,
//notepad——–打开记事本,dvdplay——–DVD播放器等
    public Process exec(String command) throws IOException {
        return exec(command, null, null);
    }

  使用exec示例:

import java.io.IOException;
 
public class RuntimeTest01 {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		try {
			rt.exec(" explorer");//打开文件浏览器
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  我们之前用到的Calendar日历类,是抽象类,不能通过new来创建对象,它有getInstance方法,可以使用该方法获得此类型的一个通用对象,但是Calendar类并不是单例模式,所以不是所有私有构造方法、对外通过getInstance方法提供实例的类都是单例模式,Calendar是抽象类

public static Calendar getInstance()
    {
        Locale aLocale = Locale.getDefault(Locale.Category.FORMAT);
        return createCalendar(defaultTimeZone(aLocale), aLocale);
    }
//默认返回当前国家/地区下的日期格式

  简单使用Calendar获取当前年月日:

import java.util.Calendar;
 
public class CalendarTest01 {
 
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		System.out.println(c.get(Calendar.YEAR));
		System.out.println(c.get(Calendar.MONTH) + 1);// 0表示1月份
		System.out.println(c.get(Calendar.DAY_OF_MONTH));
	}
}
out:
2018
11
25


  版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习Java多线程时使用

132 2811 3191
预约免费试学
点击咨询
预约试学