多线程-单例模式与多线程

前言

单例模式与多线程技术的结合,会出现很多的情况,所以再多线程和单例进行结合时需要多的去考虑一些问题,其实中心只有一个就是保住使用单例模式时多线程是安全的正确的.


内容

立即加载的"饿汉式"
什么是立即加载

立即加载就是指,在使用累的时候就已经将对象创建完毕,常见的实现办法就是直接new一个新的实例
饿汉式的应用

package singletest

public class HObject(){
//立即加载方式==饿汉模式
private static HObject hObject = new HObject();
private HObject(){
} 
public static HObject getInstance(){
//此代码版本为立即加载
//此版本代码的缺点是不能有其他实例的变量
//因为getinstance(方法没有同步)
//所以有可能会出现非线程安全的问题
return lObject;
}
}
package extthread;
import singletest.HObject;
public class HThread extends Thread{
@override
public void run(){
	System.out.print(HObject.getinstance().hashCode());
}
}
package singletest.run;
import extthread.HThread ;
public class Run(){
public  static void main(String[] args){
 HThread  t1 =new HThread ();
 HThread  t2 =new HThread ();
 HThread  t3 =new HThread ();
t1.start();
t2.start();
t3.start();
}
}

延迟加载的"懒汉式"

什么是延迟加载

延迟加载就是在调用get()方法时实力才被创建,常见的实现办法就是在get方法中进行实例化,

懒汉式解析

package singletest;
public class LObject(){
//延迟加载==懒汉模式
private static LObject lObject = new LObject();
private LObject (){
} 
public static LObject getInstance(){
try{
//此代码版本为延迟加载
if ( lObject !=null){
}else{
Thread.sleep(3000);
 lObject=new LObject();
}}catch(Interrupt额Exception e ){
e.printStackTrace();

}
return lObject;
}
}
package extthread;
import singletest.LObject;
public class LThread extends Thread{
@override
public void run(){
	System.out.print(LObject.getinstance().hashCode());
}
}
package singletest.run;
import extthread.LObject;
public class Run(){
public  static void main(String[] args){
 LThread t1 =new LThread();
 LThread t2=new LThread();
 LThread t3=new LThread();
t1.start();
t2.start();
t3.start();
}
}

懒汉式缺点

	在前面延迟加载的懒汉模式代码是错误的,根本不能实现保持单例的状态,会创建出多例模式

懒汉式解决方案

package singletest;
public class LObject(){
//延迟加载==懒汉模式
private volatile static LObject lObject ;
private LObject (){
} 
public static LObject getInstance(){
try{
//此代码版本为延迟加载
if ( lObject !=null){
}else{
Thread.sleep(3000);
synchronized (LObject.class)
if(lObject== null ){
 lObject=new LObject();
}
}
}
}catch(Interrupt额Exception e ){
e.printStackTrace();

}
return lObject;
//此版本代码称之为双重检查Double -Check Locking
}
}



package extthread;
import singletest.LObject;
public class LThread extends Thread{
@override
public void run(){
	System.out.print(LObject.getinstance().hashCode());
}
}


package singletest.run;
import extthread.LObject;
public class Run(){
public  static void main(String[] args){
 LThread t1 =new LThread();
 LThread t2=new LThread();
 LThread t3=new LThread();
t1.start();
t2.start();
t3.start();
}
}

什么是延迟加载
懒汉式解析


小结

感谢您的阅读~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值