首页 > 代码库 > (单例设计模式中)懒汉式与饿汉式在多线程中的不同
(单例设计模式中)懒汉式与饿汉式在多线程中的不同
/* 目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同! 开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题! 而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高!*//* class SinglePerson implements Runnable{ private static SinglePerson ss = new SinglePerson("hjz", 22);//恶汉式 private int age; private String name; private int count; private SinglePerson(String name, int age){ this.age = age; this.name = name; } private SinglePerson(){ age = 10; name = " "; } public static SinglePerson getInstance(){ return ss; } public String getName(){ return name; } public int getAge(){ return age; } public void setIntroduceCount(){ ++count; } public int getIntroduceCount(){ return count; } public synchronized void run(){ ss.setIntroduceCount(); try{ Thread.sleep(20); }catch(InterruptedException e){ } System.out.println("this is " + ss.getName() + " " + ss.getAge() + " 被介绍的次数是:" + ss.getIntroduceCount()); } } */ class SinglePerson implements Runnable{ private static SinglePerson ss = null;//懒汉式 private int age; private String name; private int count; private SinglePerson(String name, int age){ this.age = age; this.name = name; count=0; } private SinglePerson(){ age = 10; name = " "; } /*public static SinglePerson getInstance(){ if(ss==null){//单例设计模式中,懒汉式在多线程中的缺憾啊!可能不能保证对象的唯一性 try{ Thread.sleep(10); }catch(InterruptedException e){} ss = new SinglePerson("hjz", 22); } return ss; }*/ /* public static synchronized SinglePerson getInstance(){//保证了对象的唯一性,也就是安全性保证了!但是每当调用该函数时 if(ss==null){ //都要判断一下同步锁对象,降低了程序的效率! try{ Thread.sleep(10); }catch(InterruptedException e){} ss = new SinglePerson("hjz", 22); } return ss; } */ public static SinglePerson getInstance(){//这就是懒汉式的安全又效率的代码! if(ss==null){//这一句是必须判断的! synchronized(SinglePerson.class){//这一句只是其他的线程访问时判断 if(ss==null){ try{ Thread.sleep(10); }catch(InterruptedException e){} ss = new SinglePerson("hjz", 22); } } } return ss; } public String getName(){ return name; } public int getAge(){ return age; } public void setIntroduceCount(){ ++count; } public int getIntroduceCount(){ return count; } public synchronized void run(){ ss.setIntroduceCount(); System.out.println("this is " + ss.getName() + " " + ss.getAge() + " 被介绍的次数是:" + ss.getIntroduceCount()); }}class OtherThread extends Thread{ public void run(){ SinglePerson.getInstance().run(); }}public class Test{ public static void main(String[] args){ new OtherThread().start(); new OtherThread().start(); new OtherThread().start(); new Thread(SinglePerson.getInstance()).start(); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。