多线程-单例模式涉及的多线程安全问题
1 package multithread.test; 2 3 4 /* 5 * 多线程下的单例 6 * 7 * 8 */ 9 //饿汉式(单例设计模式) 10 class Single { 11 private static final Single s = new Single(); 12 private Single() {} 13 public static Single getInstance() { 14 return s; 15 } 16 } 17 //懒汉式(延迟加载单例设计模式) 18 class Single { 19 private static Single s = null; 20 21 private Single() {} 22 public static /*synchronized*/ Single getInstance() {//加同步会解决线程安全问题,但会影响效率每次线程过来都要判断锁,所以用同步代码块 23 if(s == null) {//多加一步判断是为了解决效率问题 24 synchronized(Single.class) {//不能用this 和this.getClass()因为这是非静态的 25 if(s==null) { 26 // -->0 -->1 //可能都判断过if了 不保证唯一了两个对象,在多线程就不行了 27 s = new Single(); 28 } 29 30 }//加锁是为了解决线程安全问题 31 } 32 33 return s; 34 35 } 36 } 37 public class SingleDemo { 38 39 public static void main(String[] args) { 40 // TODO Auto-generated method stub 41 42 } 43 44 }