黑马程序员——单例的两种实现方式

单例模式只是像外界提供一个对象,它在自己内部创建一个自己的对象并且提供一个方法让外界来得到,从而保证程序中只有一个自己的对象。

第一种:饿汉式

public class Single {
 
 private static final Single s = new Single(); //创建仅有的一个对象
 
 //构造函数必须私有化
 private Single(){
  
 }
 
 //向外界提供一个得到该对象的方法
 public static Single getInstance(){
  return s;
 }
 
}

 

 

private static final Single s = new Single();

这里的final写与不写都可以,但是写上的话会更严谨,所以还是写上好

第二种:懒汉式(延迟加载)

public class Single {
 
 private static Single s = null;
 
 private Single(){
  
 }
 
 public static Single getInstance(){
  
  if(s==null){
   s = new Single(); 
  }
  
  return s;
 }
 
}

 


该写法延迟了对象的创建,更加节约空间,因为在调用getInstance方法时才创建对象。


这里要注意
private static (这里不能像饿汉式那样写final,因为是延迟加载,如果写了final关键字那么s就一直为null了)Single s = null

 

懒汉式还有一个多线程访问时的安全问题

public static Single getInstance(){
  
  if(s==null){
                         ==》A线程
                         ==》B线程               
   s = new Single(); 
  }
  
  return s;
 }


如果A线程进来后走到箭头指的位置后cpu切换到了B线程,那么A就会停在那个位置然后B线程开始走,B线程再停在那里A线程醒了就会出现这两个线程都进入到if的判断了,于是会创建两次对象,而单例只能有一个对象,所以要让给方法进行同步处理

public static synchronized Single getInstance(){
  
  if(s==null){           
   s = new Single(); 
  }
  
  return s;
}

 

进行同步后就解决了问题

但是这里还有个效率的问题,因为加了同步后每个线程都要判断锁会很慢,所以应该优化一下

 

public static Single getInstance(){
  if(s==null){
   synchronized(Single.class){
    if(s==null){
     s = new Single(); 
    }
   }
  } 
  return s;
}


上面多了一层判断,因为多个线程进来时都会判断一层外层的s是否为null,当对象没创建的时候就会继续判断锁,直到创建对象。然后其他的线程进来后直接判断第一层的s是否为null,因为已近创建了对象所以他就不会再去判断锁了也就提高了效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值