前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式——单例模式(Singleton Pattern)

设计模式——单例模式(Singleton Pattern)

原创
作者头像
来啦老弟
修改2019-08-30 10:14:59
4600
修改2019-08-30 10:14:59
举报
文章被收录于专栏:Roger的Java路Roger的Java路

【什么是单例模式】

有些场景,我们只有一个对象,那么这个时候我们就要用到单例模式。单例模式是在被用到的时候才会被创建,不 用的时候不会,比较节省系统资源

【单例模式的作用】

系统中只有一个对象

【单例模式的举例】

Windowsa操作系统的任务

【如何做到只有一个对象】

1 只要构造函数是私有的,就不能被外面的类多次创建对象

2 因为是私有的构造函数,那么就需要在类的内部创建这个对象

3 这样就需要对外提供一个静态方法,从而才能够调用此对象

【单例模式举例子,懒汉模式——我们只有一个孔夫子】

代码语言:javascript
复制
public class Confucius {
	private static Confucius confucius;
	private Confucius(){
		
	}
	
	public static  Confucius getConfucius(){
		if(confucius==null)
		{
			 confucius=new Confucius();
		}
		
		return confucius;
	}
}

【单例模式的线程安全问题】

上面的单例存在线程安全的问题,启动四个线程,就会出现多个Confucius如图

代码语言:javascript
复制
public class TestConfucius {
	public static void main(String args[]) {   
		Thread t1= new Thread(){

            public void run(){

        		System.out.println(Confucius.getConfucius());

                }           
        };
        
        Thread t2= new Thread(){

            public void run(){

        		System.out.println(Confucius.getConfucius());

                }           
        };
        

        Thread t3= new Thread(){

            public void run(){

        		System.out.println(Confucius.getConfucius());
                }           
        };

        Thread t4= new Thread(){

            public void run(){

        		System.out.println(Confucius.getConfucius());


                }           
        };
        
        t1.start();
        t2.start();
        t3.start();
        t4.start();
	} 
}

上面出现了连个Confucius对象
上面出现了连个Confucius对象

【如何解决线程】

如何解决线程安全问题

方法1:使用饿汉模式

方法2:加synchronize 关键字

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【什么是单例模式】
  • 【单例模式的作用】
  • 【单例模式的举例】
  • 【如何做到只有一个对象】
  • 【单例模式举例子,懒汉模式——我们只有一个孔夫子】
  • 【如何解决线程】
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档