1、单例模式(立即加载、延时加载)
来源:互联网 发布:windows安装centos引导 编辑:程序博客网 时间:2024/06/04 00:32
A、饿汉模式
package demo;
/** * Created by sunyifeng on 17/10/19. */public class ObjectA { // 饿汗模式(立即加载) private static ObjectA myObject = new ObjectA(); public ObjectA() { // do noting } public static ObjectA getInstance() { return myObject; }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadA extends Thread { @Override public void run() { super.run(); System.out.println(ObjectA.getInstance()); }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class RunA { public static void main(String[] args) { ThreadA threadA1 = new ThreadA(); ThreadA threadA2 = new ThreadA(); ThreadA threadA3 = new ThreadA(); threadA1.start(); threadA2.start(); threadA3.start(); }}
运行结果:demo.ObjectB@2e2f95db
demo.ObjectB@2e2f95db
demo.ObjectB@2e2f95db
程序分析:
1、饿汉模式,实例变量赋值给静态变量,在被调用之前,类加载的时候即创建实例;
2、执行结果线程三个线程调用的是同一个实例;
2、该模式的缺点是如果有其他实例变量,不能保证线程安全。
B、懒汉模式
package demo;/** * Created by sunyifeng on 17/10/19. */public class ObjectB { // 懒汉模式(延时加载) private volatile static ObjectB myObject2; private ObjectB() { } public static ObjectB getInstance() { try { Thread.sleep(3000); synchronized (ObjectB.class) { if (myObject2 == null) { myObject2 = new ObjectB(); } } } catch (InterruptedException e) { e.printStackTrace(); } return myObject2; }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadB extends Thread { @Override public void run() { super.run(); System.out.println(ObjectB.getInstance()); }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class RunB { public static void main(String[] args) { ThreadB threadB1 = new ThreadB(); ThreadB threadB2 = new ThreadB(); ThreadB threadB3 = new ThreadB(); // threadB1.start(); threadB2.start(); threadB3.start(); }}
运行结果:demo.ObjectB@1e682cd7
demo.ObjectB@1e682cd7
demo.ObjectB@1e682cd7
程序分析:
1、使用懒汉模式,三个线程取得是同一实例;
2、懒汉模式是静态变量,但是没有赋值,被调用时创建单例赋值给静态变量;
3、懒汉模式如果不同步(synchronized),每次调用时会创建不同的实例,如果同步方法或者同步代码块,效率都很低(排斥其他线程进入);
4、程序中使用了双检查锁机制(DCL)实现多线程环境中延时加载单列设计模式。
阅读全文
0 0
- 1、单例模式(立即加载、延时加载)
- 单例模式之饿汉模式(立即加载)
- 单例模式 (一) 立即加载/"饿汉模式"
- 延时加载和立即加载的区别
- 由延时加载的单例模式引发的思考
- Java的单例模式与延时加载
- 懒加载(延时加载)
- 单例模式懒加载
- 单例延迟加载模式
- 单例模式加载配置文件
- 延时加载
- 延时加载
- 单例模式之懒汉模式(延迟加载)
- ViewPager延时加载(懒加载)
- 延时加载 懒加载
- 延时加载|懒加载
- 延时加载(lazy load)
- 单例模式 懒加载和惰性加载
- 洛谷P1164 小A点菜(母函数)
- Java Web
- 连接远程MySQL数据库
- DescriptionResourcePathLocationType Failure to transfer org.apache.maven.plugins:maven-surefire-
- Android8.0行为变更Google官方文档
- 1、单例模式(立即加载、延时加载)
- FTL 入门
- JDBC调用Oracle函数详解
- ftl 常用指令及语法详解
- mpi安装与配置错误记录——并行计算开端
- 第十一章 用户验证
- filter方法和find方法
- 使用spring请求头信息的获得
- 普及组初赛总结