1、懒汉式单例模式(在多线程里面就会不是一个对象了,进行加锁,加锁后效率降低,进行双重检查提高效率)
package com.ljl.thread;
/**
* 单例设计模式
* 确保一个类只有一个对象
* @author Richard
*
*/
public class SynDemo2 {
public static void main(String[] args) {
Jvm jvm1=Jvm.getInstance();
Jvm jvm2=Jvm.getInstance();
System.out.println(jvm1);
System.out.println(jvm2);
}
}
/**
*
* 一个类只有一个对象
* @author Richard
* 懒汉式
* 1)构造器私有化,避免外部直接创建对象
* 2)声明一个私有的静态变量
* 3)创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
*/
class Jvm{
//声明一个私有的静态变量
private static Jvm instance=null;//这里懒得创建对象,在你使用得时候创建对象
//构造器私有化,避免外部直接创建对象
private Jvm() {
}
//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
public static Jvm getInstance() {
if (null==instance) {
instance=new Jvm();
}
return instance;
}
}
package com.ljl.thread;
import java.sql.Time;
/**
* 单例设计模式
* 确保一个类只有一个对象
* @author Richard
*
*/
public class SynDemo2 {
public static void main(String[] args) {
JvmThread thread1=new JvmThread(100);
JvmThread thread2=new JvmThread(500);
thread1.start();
thread2.start();
}
}
class JvmThread extends Thread{
private long time;
public JvmThread() {
}
public JvmThread(long time) {
this.time=time;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"创建"+Jvm.getInstance(time));
}
}
/**
*
* 一个类只有一个对象
* @author Richard
* 懒汉式
* 1)构造器私有化,避免外部直接创建对象
* 2)声明一个私有的静态变量
* 3)创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
*/
class Jvm{
//声明一个私有的静态变量
private static Jvm instance=null;//这里懒得创建对象,在你使用得时候创建对象
//构造器私有化,避免外部直接创建对象
private Jvm() {
}
//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
public static synchronized Jvm getInstance(long time) {
if (null==instance) {
try {
Thread.sleep(time);//延时,放大发生错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance=new Jvm();
}
return instance;
}
//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
public static Jvm getInstance2(long time) {
synchronized(Jvm.class) {
if (null==instance) {
try {
Thread.sleep(time);//延时,放大发生错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance=new Jvm();
}
return instance;
}
}
//创建一个对外的公共的静态方法访问该变量,如果变量没有对象,创建该对象
public static Jvm getInstance3(long time) {
if(null==instance) {//经典的双重检查(double checking)
synchronized(Jvm.class) {
if (null==instance) {
try {
Thread.sleep(time);//延时,放大发生错误的概率
} catch (InterruptedException e) {
e.printStackTrace();
}
instance=new Jvm();
}
}
}
return instance;
}
}