设计模式java开发实例_JAVA项目实战-设计模式——单例模式项目中运用

/*** @description: 懒汉模式-单例模式

*@author: ZhuCJ 80004071

* @date: 2020-08-19 12:43*/

public classIdlerMashSingleClass {/*** ****************懒汉模式*****************

* 实现方法

* 1.构造器私有化 (目的:保证只能本类中 才能创建出对象)

* 2.定义一个空的此对象的静态属性,并用volatile修饰(指定线程共享保证同步性)

* 3.定义一个静态方法,通过加锁的方式实现,线程之间同步

* 优点

* 1.可实现创建的对象唯一性

* 2.能延迟加载对象,需要时才会创建

* 缺点

* 1.代码比较繁琐

* 2.线程采用加锁处理,对性能影响比较大

**/

public static volatile IdlerMashSingleClass singleClass = null;/*** 私有化构造器*/

privateIdlerMashSingleClass(){

}/*** 方式一 不加锁,每个线程睡眠1秒后执行创建对象

* 会发现,单线程下创建对象是唯一的,

* 如果多个线程同时进入到if(){ }内 还是会创建多个对象

* 缺点,多线程情况下不能保证唯一

*@return

*/

public staticIdlerMashSingleClass createSingleOne(){if (singleClass == null){try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

singleClass= newIdlerMashSingleClass();

}returnsingleClass;

}/*** 方式二 结合加锁操作 直接对对方法加锁

* 可以完美解决,但是影响性能,高并发场景对方法进行加锁会导致访问时间增加

* 例如:此处如果有1000个用户访问这个方法 每个人大于耗时0.01s 那么最后一个人

* 访问时间是10s,即访问时间会增加

*@return

*/

public synchronized staticIdlerMashSingleClass createSingleTwo(){if (singleClass == null){try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

singleClass= newIdlerMashSingleClass();

}returnsingleClass;

}/*** 方式三 对对象进行加上锁

* 缺点,多线程情况下不能保证唯一

* 如果多个线程同时进入到if(){ }内 还是会创建多个对象

*@return

*/

public staticIdlerMashSingleClass createSingleThere(){if (singleClass == null){try{

Thread.sleep(10);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized (IdlerMashSingleClass.class){

singleClass= newIdlerMashSingleClass();

}

}returnsingleClass;

}/*** 方式四 对对象进行加上锁后,在对对象进行判断

* 可以完美解决,但是影响性能,高并发场景对方法进行加锁会导致访问时间增加

*@return

*/

public staticIdlerMashSingleClass createSingleFour(){if (singleClass == null){try{

Thread.sleep(10);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized (IdlerMashSingleClass.class){try{

Thread.sleep(10);

}catch(InterruptedException e) {

e.printStackTrace();

}if (singleClass == null){

singleClass= newIdlerMashSingleClass();

}

}

}returnsingleClass;

}

}/*** @description: 测试方法

*@author: ZhuCJ

* @date: 2020-08-19 13:07*/

public classMain {public static voidmain(String[] args) {/*** 定义10个线程,每个线程休眠0.5s后创建对象,

* 观察toString方法返回的hashCode值是否相等

* 注:此处创建线程建议采用线程池*/

for (int i =0;i<10;i++){new Thread(()->{try{

Thread.sleep(500);

}catch(InterruptedException e) {

e.printStackTrace();

}

String name=Thread.currentThread().getName();

IdlerMashSingleClass singleOne=IdlerMashSingleClass.createSingleFour();

System.out.println("name:"+name +singleOne.toString());

}).start();

}

}

}---------------------------------------

----1.createSingleOne()方法执行结果

name:Thread-8com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@658afb6a

name:Thread-4com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@686e97cd

name:Thread-0com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-6com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@3673cfa8

name:Thread-1com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@3573fdb0

name:Thread-2com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@76575e50

name:Thread-9com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@5a318665

name:Thread-7com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6018d1f6

name:Thread-3com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@47f6725c

name:Thread-5com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@7d731227--------2.createSingleTwo()方法执行结果

name:Thread-2com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-3com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-7com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-4com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-8com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-9com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-1com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-6com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-5com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-0com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5----------3.createSingleThree()方法执行结果

name:Thread-6com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@686e97cd

name:Thread-2com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-7com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@7d731227

name:Thread-4com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@76575e50

name:Thread-3com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@3573fdb0

name:Thread-5com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@47f6725c

name:Thread-9com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6018d1f6

name:Thread-1com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@9ec32f5

name:Thread-0com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@1f3f7e6a

name:Thread-8com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@3673cfa8----------4.createSingleFour()方法执行结果

name:Thread-3com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-7com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-9com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-8com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-5com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-6com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-1com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-2com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-4com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

name:Thread-0com.spring.zhucj.rabbitmq.designmode.single.IdlerMashSingleClass@6468d2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值