设计模式:
对问题行之有效的解决方式,是一种思想
1.单例设计模式
解决的问题:就是可以保证一个类在内存中的对象唯一性
需求:
必须对于多个程序使用同一个配置信息对象时,就要保证该对象的唯一性
如何保证对象唯一性?
1.不允许其他程序用new创建该类对象
2.在该类创建一个本类实例。
3.对外提供一个方法让其他程序可以获取该对象。
步骤:
1.私有化该类构造凤方法。这样就不能再类外创建实例了
2.通过new在本类中创建一个本类对象
3.定义一个公有的方法,将创建的对象返回
例如:
饿汉式
classSingle{
privatestatic Single = new Single();//类加载完,对象就已经存在了
private Single(){};
publicstatic Single getInstance(){
returns;
}
}
publicstatic void main(String[]args){
Singless = Single.getInstance();
Singles1 = Single.getInstance();
System.out.println(ss==s1);//true;
}
//懒汉式
class Single2{
privatestatic Single s = null;
//类加载进来,没有对象,只有调用了getInstance()方法时,才在堆中创建对象
//延迟加载
privateSingle(){};
publicstatic Single getInstance(){
if(s==null){
s = new Single();
}
returns;
}
}
验证懒汉式在多线程中可以创建多个实例(自己原创)
packagecom.sdut.day14;
publicclass ThreadDemo {
/**
* @param args
*/
publicstatic void main(String[] args) {
MyThreadmyThead1 = new MyThread("张三");
MyThreadmyThead2 = new MyThread("李四");
Threadt1 = new Thread(myThead1);
Threadt2 = new Thread(myThead2);
t1.start();
t2.start();
try{
Thread.sleep(2000);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//开始验证
System.out.println(myThead1.getCon().getName());
System.out.println(myThead2.getCon().getName());
}
}
classConfigTest {//建立懒汉式
privatestatic ConfigTest test= null;
privateConfigTest(){};
privateString name ;
publicString getName() {
returnname;
}
publicvoid setName(String name) {
this.name= name;
}
publicstatic ConfigTest getInstance(){
if(test==null){
try{
Thread.sleep(1000);//验证多线程的不安全行,此处挺一会
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
test= new ConfigTest();
}
returntest;
}
}
//创建验证任务
classMyThread implements Runnable{
privateString name ;
privateConfigTest con;
publicConfigTest getCon() {
returncon;
}
publicvoid setCon(ConfigTest con) {
this.con= con;
}
publicMyThread(String name) {
super();
this.name= name;
}
publicvoid run(){
con = ConfigTest.getInstance();//获取实例
con.setName(name);//通过设置的名字相同来确定是否时创建了两个实例
}
}
解决方法,在懒汉式单例模式加入锁。
publicstatic ConfigTest getInstance(){
synchronized(MyThread.class){
if(test==null){
try{
Thread.sleep(1000);//验证多线程的不安全行,此处挺一会
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
test= new ConfigTest();
}
}
returntest;
}
}