- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
- 入门开发其实是很简单的,尤其对于中高级开发来说学习掌握一门语言只是语法的事情。因为他们掌握了语法之后就可以借助通用的设计模式思想来结构化自己的代码。今天我们开辟一个新章节就是设计模式。设计模式是不针对具体某种语言他是代码层面的设计。
单例模式
-
单列模式中会出现线程安全问题,在不同的单列模式中有的需要检测线程安全,有的不需要线程安全。线程安全的单列模式有三种写法,分别在不同的包中运行不同的线程安全的方法。
- 方法一: 直接在工厂中的获取实例对象的方法上加synchronized 这种方法简单,但是效率慢。方法见普通单列模式中-->线程下的相关类
- 方法二: 在工厂中的获取对象具体代码中加入synchronized 这种方式相较第一种方式效率稍微快点 方法见懒汉式 -->线程下相关类
- 方法三: 在工厂中的对象中用volatile修饰,让对象在线程中透明 效率最快 方法见懒汉式-->双检查锁机制线程安全
-
因为单例的本质是保证系统值始终最多只有一个实例,但是在并发的场景下原来的单例模式会出现异常,就会违背单例模式的设计
-
还有一点因为是单例模式,在并发场景下操作的有可能会有全局变量这种情况下也必须保证其防并发。
饿汉
- 饿汉式特点是在获取实例之前就创建好实例对象了。因为是private static Person person = new Person(); static静态块特点是在项目启动运行一次,之后也不会运行。所以在饿汉式中不会存在线程安全不安全的问题。这里不用担心线程
public class SingleFactory
{
private static Person person = new Person();
private SingleFactory()
{
}
public static Person getInstance()
{
return person;
}
}
测试
public class client
{
public static void main(String[] args)
{
System.out.println("获取第一个Person类:");
Person person1=SingleFactory.getInstance();
System.out.println(person1.toString());
System.out.println("**************************");
System.out.println("获取第二个Person类:");
Person person2=SingleFactory.getInstance();
System.out.println(person2.toString());
}
}
总结
- 饿汉模式简单粗暴,不管你用不用项目一开始就创建也省去了并发创建的问题。该模式值得初学者使用!!!