1.简介
首先,下面我将要讲解的是单列模式的饿汉式和懒汉式的两种,饿汉式呢说的就是在使用对象方法之前呢就先创建了单列,懒汉式呢指的就是在使用方法的时候再创建对象。
2.单例模式(饿汉式)
首先,我们需要做的东西就是在一个类当中创建这样的一个实例。
private static Singleton singleton=new Singleton;
接下来就是在这样的一个类当中对这个单列进行一个输出,那么怎么输出呢,首先根据格式需要,我们可以先自定义一个方法
private Singleton(){
}
public static Singleton single(){
return singleton;
}
完整的代码如下:
package page1;
public class Solution {
private static Solution solution=new Solution();
private Solution(){
}
private static Solution getInstance(){
return solution;
}
public static void main(String[] args) {
System.out.println(Solution.getInstance());
}
}
接下来我们输出的就是这个单例对应的位置。
3.单例模式(懒汉式)
首先,在这里需要注意的就是,懒汉式呢就是在你需要使用方法的时候呢再创建这样的一个单列
首先前面的部分和饿汉式是一样的,你需要做的就是加锁,也就是在private之前加上这个synchronized进行一个锁住就行了,如果不加锁的话,一个线程还好,但是一旦线程变多了,那么将会出现多个线程可以同时调用一个方法,这样就会造成不安全,或者说是违背了单例原则。
synchronized private static Solution getInstance(){
if(solution==null){
solution=new Solution();
return solution;
}
return solution;
}
接下来其它部分就和上面的饿汉式是一样的
package page1;
public class Solution {
private static Solution solution=null;
private Solution(){
}
synchronized private static Solution getInstance(){
if(solution==null){
solution=new Solution();
return solution;
}
return solution;
}
public static void main(String[] args) {
System.out.println(Solution.getInstance());
}
}
4.单例模式的应用
package page1;
public class SingleDemo {
public static void main(String[] args) {
NumThread threadA = new NumThread("线程A");
NumThread threadB = new NumThread("线程B");
threadA.start();
threadB.start();
}
}
class NumThread extends Thread {
private String threadName;
public NumThread(String name) {
threadName = name;
} // 重写线程的run方法(线程任务)
public void run() {
GlobalNum gnObj = GlobalNum.getInstance();
// 循环访问,输出访问次数
for (int i = 0; i < 5; i++) {
System.out.println(threadName + "第" + gnObj.getNum() + "次访问!");
try {
this.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行结果:
线程B第1次访问!
线程A第2次访问!
线程A第4次访问!
线程B第3次访问!
线程A第5次访问!
线程B第6次访问!
线程A第7次访问!
线程B第8次访问!
线程A第9次访问!
线程B第10次访问!
Process finished with exit code 0