java破坏_如何破坏JAVA中的单例模式

这个Java程序展示了单例模式在多线程环境下的应用,通过注释实现多线程对单例模式破坏的测试。在单线程模式下,DanLi类的构造方法只会被调用一次,确保了单例。当开启多线程并取消同步修饰符时,可以观察到单例模式是否被破坏。
摘要由CSDN通过智能技术生成

/*

* 这个Java程序用于测试单例模式,并测试多线程下对单例模式的破坏

* 该程序写了单线程和多线程两种

* 为了后期测试理解单例模式,将14-20行多线程部分备注了,测试多线程时,请将11-12行备注,否则无法体现多线程对单例模式的破坏

* 多线程同步能够有效阻止多线程对单例模式的破坏,程序中31行将同步修饰符备注掉,测试阻止多线程对单例模式的破坏时,可以去除备注

*/

public class DanliDemo {

public static void main(String []args) {

//此处如果打印两次DanLi类构造方法中的语句,证明实例化对象不止一个,单例模式被破坏,否则单例模式成功。

DanLi.getDanLi();//调用DanLi的静态方法,获取对象,

DanLi.getDanLi();//再次调用静态方法,试图获取对象

/*//构造多线程去破坏单例模式

PoHuai p=new PoHuai();

Thread t1=new Thread(p);//线程1

Thread t2=new Thread(p);//线程2

t1.start();//线程1启动

t2.start();//线程2启动

*/}

}

class DanLi{//创建一个类,该类用于充当单例类

private static DanLi danLi;//声明私有的单例类对象

private DanLi() {//利用构造方法私有的方式,使得这个类无法通过构造方法构造对象

System.out.println("单例模式的私有构造方法,这句话打印超过1次,即本单例模式被破坏(有多于1个的实例化对象。)");

}

public static /*synchronized*/ DanLi getDanLi() {//提供一个公开的静态方法,利用该方法调用私有构造方法以便构造对象

if(danLi==null) {//判断静态的DanLi类对象是否为空

return danLi=new DanLi();//DanLi类对象为空即该类未被实例化,因此调用构造方法进行构造并将对象返回,以便被外部获取使用

}else {//如果不为空

return danLi;//直接返回该对象,如此能够保证该DanLi类有且只有一个实例化对象

}

}

}

//创建一个线程类,利用该类构造两个线程,试图破坏单例模式

class PoHuai implements Runnable{

public void run() {

DanLi.getDanLi();//调用单例类的静态方法,企图获取单例类对象

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值