JAVA单例模式

单例模式

是啥?

单例模式就是指强制要求在某个类中某个程序中只能有唯一一个实例不允许有多个实例,不允许new多次

饿汉模式

非常饥饿,在程序一开始就new了出来

将构造方法私有化,然后在一开始就把这个对象创建出来,因为是static修饰的,所以在程序一启动就被创建出来了,在外部无法创建新的对象

通过类名.方法可以看到两个是一样的

懒汉

尽可能的较晚创建甚至不创建,创建的时机是在第一次使用的时候。

在多线程运行中可能出现的问题【经典面试题】

懒汉和饿汉在多线程运行中线程是否是安全的,如果不是,该怎么办

饿汉

在多线程调用的时候会不会产生线程安全问题?

不会产生线程安全问题,因为被static修饰,在程序一启动就开始创建,后续无论被哪个线程调用或者修改,始终都是只有一份,所有的操作也都是原子性的,所以不会产生线程安全问题

懒汉

懒汉模式在多线程的情况下会有线程安全的问题吗?

假如现在有两个线程同时调度,因为调度是随机的,可能一个线程刚开始创建instance,另外一个已经创建完了,这里就会出现不必要的创建,浪费资源,最后会被GC给回收掉,但确实是浪费了当时的资源,假如很大的情况下就会爆了。

如何解决?

加锁

伴随着加锁,新的问题又来了,假如我已经调过一次了,后续都不需要了,

后续的只是判断和读操作,不会涉及线程安全,但是后续的操作都会涉及到加锁,在多线程的情况下就会相互阻塞,这咋整?

多加一个if判断

这里看起来好像是天衣无缝了,但是实际上还是存在着问题,在两个线程进行读写的时候,这里会出现内存可见性的问题

假设现在有两个线程,一个读取,一个修改,t1还在创建的时候,t2已经读取完了,这就导致之后的t2读取到的是还没初始化的对象,如何解决呢?

加一个volatile告诉计算机别偷懒,不要进行指令重排序

Ok,现在就解决了多线程之间的问题

相关推荐
weixin19970108016几秒前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
武子康4 分钟前
Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理
java·后端
未若君雅裁12 分钟前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
摇滚侠28 分钟前
SpringMVC 入门到实战 简介和入门案例 01-13
java·后端·spring·intellij-idea
未若君雅裁28 分钟前
JVM 垃圾回收器全景与G1深度解析
java·开发语言·jvm
霸道流氓气质29 分钟前
Java 大数据量异步处理方案:线程池 vs 消息队列
java·开发语言
devilnumber29 分钟前
想真正吃透 + 灵活运用 Java 代理模式
java·开发语言·代理模式
蝎子莱莱爱打怪29 分钟前
自用推荐|XTerminal:我心中 SSH 客户端的终极形态
java·后端·程序员
AIGS00133 分钟前
向量空间JBoltAI:重塑工业智能的四大支柱
java·人工智能·ai大模型应用
刘科领36 分钟前
修改jdk 第一步: 仓库以及构建(jdk17)
java·开发语言