目录
一、单例模式
单例模式(Singleton Pattern)是Java中最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。
使一个类在一个程序中只能创建一个对象。例如:widows任务资源管理器窗口,只需要创建一个,这样可以避免打开多个任务管理器而造成的内存资源浪费,或者出现各个窗口显示的不一致等错误。
单例模式的特点:
1.单例类只有一个实例对象;
2.该单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点;
单例模式的结构:
单例类:包含一个实例且能自行创建这个实例的类。
访问类:使用单例的类。其结果如图所示:
二、单例模式实现方式
1..饿汉式单例模式(急切式):在类加载时就把唯一的单例对象创建好了。不存在线程安全问题。
2..懒汉式单例模式:在类加载时不会创建单例对象,在第一次获取单例对象时才创建,存在线程安全。
饿汉式:
先创建一个单例类,再进行测试
/*饿汉式单例模式(急切)在类加载时就把唯一的单例模式创建。不存在线程安全问题·*/
public class WindowDemo {
static WindowDemo windowDemo = new WindowDemo();
//构造方法私有发,要不会在外面new
private WindowDemo(){
}
public static WindowDemo getWindowDemo() {
return windowDemo;
}
}
public class Test {
public static void main(String[] args){
System.out.println(WindowDemo.getWindowDemo());
System.out.println(WindowDemo.getWindowDemo());
System.out.println(WindowDemo.getWindowDemo());
}
}
运行结果:
该结果表明单例模式只创建了一个对象。
懒汉式:
package com.ffyc.javapro.javaoopdesign.design.singleton.demo2;
/*懒汉式单例模式:在类加载时就不会单例模式创建,在第一次获取单例对象时才创建存在线程安全问题·
* 解决线程安全问题方法:双重检索+volatile*/
public class WindowDemo {
static volatile WindowDemo windowDemo ;
//构造方法私有发,要不会在外面new
private WindowDemo(){
}
/*在并发量大的时候,多个线程来,会创建多个对象*/
/* public static WindowDemo getWindowDemo() {
if(windowDemo==null){
windowDemo = new WindowDemo();
}
return windowDemo;
}*/
/*在门里面加一般锁,后面的线程还回来效率低*/
/* public static WindowDemo getWindowDemo() {
synchronized (WindowDemo.class){
if(windowDemo==null){
windowDemo = new WindowDemo();
}
}
return windowDemo;
}*/
public static WindowDemo getWindowDemo() {
if(windowDemo==null){
synchronized (WindowDemo.class){
if(windowDemo==null){
windowDemo = new WindowDemo();
}
}
}
return windowDemo;
}
}
测试结果:
懒汉式单例模式怎样保证线程安全呢?
使用双重检索+volatile
volatile关键字可以防止指令重排,这样就会防止多个线程进入程序,创建多个对象。
三、Runtime类
Runtime类就是JavaSE中典型的单例模式。
利用Runtime类可以启动新的进程或相关运行时环境的操作。比如,取得内存空间以及释放内存空间。
四、指令重排
参考文章:指令重排与半初始化状态-优快云博客