目录
一、饿汉式和懒汉式单例模式(单线程示例)
- 一、饿汉式和懒汉式单例模式(单线程示例)
- 二、懒汉式单例模式(多线程示例)
- 三、懒汉式单例模式(多线程示例,使用同步方法的方式)
- 四、懒汉式单例模式(多线程示例,使用双重检查加锁方式)
- 五、懒汉式单例模式(多线程示例,使用双重检查加锁和volatile关键字结合的方式)推荐使用此方式
1、饿汉式单例模式代码
package com.xz.thread.t4;
/**
* @description: 饿汉式单例模式
* @author: xz
*/
public class HungrySingleton {
//直接声明一个需要被单例的对象,并初始化
private static HungrySingleton singleton=new HungrySingleton();
//私有化构造方法
private HungrySingleton(){}
//对外提供一个静态的获取实例的方法
public static HungrySingleton getInstance(){
return singleton;
}
}
2、懒汉式单例模式代码
package com.xz.thread.t4;
/**
* @description: 懒汉式单例模式
* @author: xz
*/
public class LazySingleton {
//直接声明一个需要被单例的对象,
private static LazySingleton singleton2;
//私有化构造方法
private LazySingleton(){}
public static LazySingleton getInstance(){
if(singleton2 == null ){
singleton2=new LazySingleton();
}
return singleton2;
}
}
3、饿汉式和懒汉式单线程测试类
package com.xz.thread.t4;
/**
* @description:
* @author: xz
*/
public class Main {
public static void main(String[] args) {
HungrySingleton st1= HungrySingleton.getInstance();
HungrySingleton st2= HungrySingleton.getInstance();
HungrySingleton st3= HungrySingleton.getInstance();
System.out.println("饿汉式单例模式=========");
System.out.println(st1);
System.out.println(st2);
System.out.println(st3);
LazySingleton s1= LazySingleton.getInstance();
LazySingleton s2= LazySingleton.getInstance();
LazySingleton s3= LazySingleton.getInstance();
System.out.println("懒汉式单例模式=========");
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
4、输出结果 5、结论
- 由第4步输出结果截图可知,在单线程情况下,饿汉式和懒汉式单例模式都是获取的同一对象。
1、懒汉式单例模式代码
package com.xz.thread.t4;
/**
* @description: 懒汉式单例模式
* @author: xz
*/
public class LazySingleton {
//直接声明一个需要被单例的对象,
private static LazySingleton singleton2;
//私有化构造方法
private LazySingleton(){}
public static LazySingleton getInstance(){
if(singleton2 == null ){
singleton2=new LazySingleton();
}
return singleton2;
}
}
2、懒汉式多线程测试类
package com.xz.thread.t4;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @description:
* @author: xz
*/
public class ThreadMain {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(20);
for(int i=0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?