/*** @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