前言 |
单例模式与多线程技术的结合,会出现很多的情况,所以再多线程和单例进行结合时需要多的去考虑一些问题,其实中心只有一个就是保住使用单例模式时多线程是安全的正确的.
内容 |
立即加载的"饿汉式"
什么是立即加载
立即加载就是指,在使用累的时候就已经将对象创建完毕,常见的实现办法就是直接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();
}
}
什么是延迟加载
懒汉式解析
小结 |
感谢您的阅读~