一、单例模式的定义与特点
避免多个任务不一致。同一时刻,只有一种状态。
例:回收站、文件系统、线程池、显卡的驱动程序对象、打印机、日志、计数器、配置对象、对话框、缓存常被设计成单例
1.一个类中,只有一个实例,提供访问这个实例的全局点
2.私有构造器,静态方法,静态变量
3.双重检查加锁实现,会失效
4.多个类加载器,单例失效,产生多个实例
二、单例模式的结构与实
(1)私有构造函数:外部无法调用,无法生成多个实例
ps:公开的类,可以多次实例化,构造器类,不能被实例化
(2)静态公有方法:获取静态私有实例,向外提供;引用,用类名。
(3)避免用全局变量,耗资源,需要时再创建。
三、两种实现形式
(1)懒汉式单例
加载时没生成单例,调用 getlnstance 创建。
volatile 和 synchronized,线程安全,每次访问要同步,影响性能,消耗资源
(2)饿汉式单例
加载就创建。不改变,线程安全
四、应用实例
(1)懒汉式产生美国当今总统对象
每一届任期内,只有一人,
(2)饿汉式产生猪八戒对象
猪八戒只有一个,适合用单例模式。
显示猪八戒图像,用框架窗体 JFrame 组件,定义成面板 JPanel 子类,包含标签,保存猪八戒图像,客户窗体获得猪八戒对象,显示
五、应用场景
只生成一个对象,一个班长、身份证号等。
被共享场合,连接池,需要频繁实例化,频繁销毁。
双重加锁
假设去掉同步块中的是否为null判断,
A、B线程都在同步块外面判断了synchronizedSingleton为null,
A先获锁,进同步块,创造实例,A退出返回创造实例,
B进入同步块,同步块里没判断是否为null,B线程也创造返回,多个实例。