疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

多线程下的单例设计模式_软件培训


 

      众所周知,单例模式中,构造方法是私有化的,通过静态方法内部调用构造函数返回该类的实例对象。常见的代码如下所示:

  public class Singleton {

  private static Singleton singletonObj;

  private Singleton(){}

  public static Singleton getInstance(){

  if(singletonObj == null){

  singletonObj = new Singleton();

  }

  return singletonObj;

  }

  }

  在单线程的情况下,确实可以保证只有一个实例,但是在多线程的情况下,就会发生意想不到的情况。

  创建一个TestSingleton类,如下:

  public class TestSingleton implements Runnable {

  private Singleton s = null;

  public Singleton getS() {

  return s;

  }

  public void setS(Singleton s) {

  this.s = s;

  }

  public static void main(String[] args) {

  TestSingleton ts1 = new TestSingleton();

  TestSingleton ts2 = new TestSingleton();

  Thread t1 = new Thread(ts1);

  Thread t2 = new Thread(ts2);

  t1.start();

  t2.start();

  Singleton s1 = ts1.getS();

  Singleton s2 = ts2.getS();

  System.out.println(s1 == s2);

  }

  @Override

  public void run() {

  s = Singleton.getInstance();

  }

  }

  运行结果返回 false

  在多线程的环境中需要考虑同步的问题,对上述单例模式的代码进行修改,如下:

  public static Singleton getInstance() {

  if (singletonObj == null) {

  synchronized (Singleton.class) {

  if (singletonObj == null) {

  singletonObj = new Singleton();

  }

  }

  }

  return singletonObj;

  }

  重新运行上述TestSingleton ,返回结果 true 此时,保证即使是在多线程的环境下,依然能够保持单例模式的正确性。 

  目前在就业市场上最为“吃香”的还是Java工程师和Android工程师,但很多高校缺乏的正是对学生进行正规、专业的职业素质培训,大学生由于没有相关的实用技能和项目经验,企业对应届生并不看好。专家指出,因为知识是无限的,而技能是有限的,所以对大学生个人来讲,除了知识以外,更需要掌握技能,因为技能才是核心竞争力。大学生提升技能,逆袭高薪,首选疯狂Java培训(疯狂软件学院http://www.fkjava.org/抢座热线:020-28309358,020-28309378咨询QQ:707552864,544627560 )。