有些对象其实我们只需要一个,比方说:线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机和显卡等设备的驱动程序的对象。这些对象只需要一个,如果制造出多个实例,就会导致许多问题产生,比如:程序的行为异常、资源使用过量,或者是不一致的结果。
设计模式中的单件模式,能够很好地适应这种需求。以下代码考虑到了,多线程可能出现的单线程中没有的问题。给出了几种常见的解决方案。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication6;
import java.util.ArrayList;
/**
*多线程同样能保证单实例对象。
* @author Admin
*/
public class Singleton {
//处理对线程2.在JVM加载类时,马上创建唯一的单件实例。
//private static Singleton uniqueInstance=new Singleton();//其他地方采用普通做法
private volatile static Singleton uniqueInstance;//普通做法的没有volatile
private ArrayList arr=new ArrayList();
private void Singleton(){}
public static Singleton getInstance(){//处理多线程1.static后面添加synchronized,同步该方法。
if(uniqueInstance==null){//普通做法的没有这句
synchronized (Singleton.class){//普通做法的没有这句
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
public void setItem(String item){
arr.add(item);
}
public void print(){
for(int i=0;i<arr.size();i++){
System.out.println(arr.get(i));
}
}
}
多线程几种解决方案综述:
(1)把生产单例对象的方法设置成同步方法。
(2)在JVM加载类时,马上创建一个单例实例对象,即不适用实例化的方法。
(3)使用双重检查加锁,首先检查是否实例已经创建了,若果尚未创建,“才”进行同步。这样,只有第一次会同步,这个方法是最好的。但是有一个显示,必须使用java5以上的版本。