多线程编程之单例模式与多线程 学习笔记

立即加载(使用类的时候已经将对象创建完毕 实现办法就是直接new实例化):也称为饿汉模式

private static MyObject myObject = new MyObject();
public static MyObject geInstance() {
return myObject;
}

延迟加载,懒汉模式

private static MyObject myObject;
public static MyObject getInstance() {
if (myObject != null) {

} else {
myObject = new MyObject();
}
return myObject;
}

在多线程的环境中,就会出现多个实例,与单例模式的初衷相背离

解决:1给getInstance()加锁,synchronized。。。弊端:运行效率非常低下

    2:把getInstance()的方法体放入同步代码块中 、、、弊端: 运行效率也是非常低

3:针对部分重要的代码进行单独的同步,只同步   myObject = new  MyObject();   错误:得到的不是同一个实例对象

  4:使用 DCL双检查锁机制  可以解决多线程 单例模式的非线程安全问题

private static MyObject myObject;
public static MyObject getInstance() {
if (myObject != null) {

} else {
synchronized (MyObject.class) {
if (myObject != null) {
myObject = new MyObject();
}
}
}
return myObject;
}

5使用静态内置类实现单例模式   弊端:遇到序列化对象时,使用默认的方式运行得到的结果还是多例,

private static class MyObjectHandler {
private static MyObject myObject = new MyObject();

}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}

6使用static代码块实现单例模式

private static MyObject instance = null;
private MyObject (){

}
static {
instance = new MyObject();
}
public static MyObject getInstance() {
return instance;
}


7使用enum类型实现单例模式   弊端:将枚举类型进行暴露,违反了“职责单一原则”

public enum MyObjects {
connectionfactory;
private Connection connection;
private MyObjects() {
try {
connection = DriverManager.getConnection("url","userName","userPassword");
} catch (Exception e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return connection;
}
外部
调用获取单例

MyObjects.connectionfactory.getConnection().hasCode();

PS:完善:整个枚举类以内置类的方式写入另外的类中,在其类中写一个getConnection的方法,方法体就是MyObjects.connectionfactory.getConnection().hasCode();






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值