JAVA中的单例模式

单例模式确保类只有一个实例,并提供全局访问点。饿汉模式在类加载时初始化,避免线程安全问题;懒汉模式延迟初始化,但在多线程环境下需处理安全问题。为使懒汉模式线程安全,可使用加锁、volatile和双重检查锁定。
摘要由CSDN通过智能技术生成

两种不同的单例模式

单例模式顾名思义就是一种只有一个实例的代码模式,简单的来说就是只能new一次.

饿汉模式

 饿汉模式:上述代码的执行时机是在Singleton类在JVM加载的时候,也就是说Singleton会在JVM第一次加载的时候就NEW一个对象.并且别的线程只能获取singleton而不能改变他的值.如果说当其他线程中不小心再一次NEW了一个对象编译器就会报错.

 懒汉模式

 懒汉模式:在这种模式下代码不会一开始就NEW一个对象,只有当你需要一个对象的时候他才会帮你NEW一个对象.但是能这个模式他会改变singlentonlazy的值这也就会有线程安全的问题

单例模式中存在的线程安全问题

当多个线程同时修改一个变量就会发生线程安全问题.上述的两种模式,饿汉模式只能读取变量所以并不会发生线程安全问题.懒汉模式中new操作并不是一个原子而且'SingletonLazy==null'这一语句会触发内存可见性,所以需要对懒汉模式进行一些改进使得他是线程安全的.

 上述代码就是安全的代码了.通过加锁,volatile,双重if来保证安全.

其中对双重if进行进一步的解释:由于并不是每次调用都需要加锁,所以当一个if是判断是不是第一次进行NEW.第二个if是防止多个线程阻塞时时间过长,有可能别的线程改变了singlentonlazy的值.防止再次NEW一个.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值