package com.dasenlin.singleton;
/**
* 单利设计模式,在外部调用的时候,一个类自有一个对象
* 懒汉式创建对象
* @author Administrator
* 1.构造器私有化(外部不能创建对象,创建对象由类内部自己完成)
* 2.申明一个私有的静态变量
* 3.创建一个对外的公共的静态的方法, 访问该变量,如果变量没有对象,创建该对象
*/
public class Sington {
//申明一个私有静态变量
private static Sington instance=null;
//构造方法私有化
private Sington(){
}
//添加一个代码,提高这个的效率
public static Sington getInstance2(long time){
if(null==instance){
synchronized(Sington.class){
if(null==instance){
try {
Thread.sleep(time);//加大延时,扩大出现错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance =new Sington();
}
return instance;
}
}
return instance;//反正是同一个对象,如果发现已经创建了,直接返回对象
}
//代码块同步,效率比较低
public static Sington getInstance(long time){
synchronized(Sington.class){
if(null==instance){
try {
Thread.sleep(time);//加大延时,扩大出现错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance =new Sington();
}
return instance;
}
}
//公共的静态方法1
public static synchronized Sington getInstance1(long time){
if(null==instance){
try {
Thread.sleep(time);//加大延时,扩大出现错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance =new Sington();
}
return instance;
}
}
//创建多线程调用方法
class ThreadSingleton extends Thread{
private long time;
public ThreadSingleton(long time) {
super();
this.time = time;
}
public ThreadSingleton() {
super();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"创建调用"+Sington.getInstance1(time));
}
}
调用部分
package com.dasenlin.singleton;
public class Test {
public static void main(String[] args) {
ThreadSingleton ts1 = new ThreadSingleton(100);
ThreadSingleton ts2 = new ThreadSingleton(500);
ts1.start();
ts2.start();
}
}
关于单线程和多线程模式时访问懒汉式单例模式
最新推荐文章于 2024-10-17 09:45:23 发布