当前位置: 代码迷 >> 综合 >> JAVA(17)-设计模式-多线程-单例-synchronized-volatile
  详细解决方案

JAVA(17)-设计模式-多线程-单例-synchronized-volatile

热度:47   发布时间:2024-01-29 02:55:04.0

单例:在虚拟机里保证类对象只有一个。比如:计数器。
1.直接初始化
2.你用我的时候我再初始化:
问题:多线程的时候会出现多个
3.加锁 synchronized
4.加锁加强版
5.防止指令重排序 volatile


1.直接初始化

Public calss Mgr01
{private static final Mgr01 INSTANCE =new Mgr01();private Mgr01(){}public static Mgr01 getInstance(){return INSTANCE;}public void m(){System.out.println("m");}public static void main(){Mgr01 m1=Mgr01.getInstance();Mgr01 m2=Mgr01.getInstance();System.out.println(m1==m2);}  
}

2.你用我的时候我再初始化
问题:多线程的时候会出现多个

Public calss Mgr02
{  private static final Mgr02 INSTANCE;//1.实例变量private Mgr02(){}                   //2.构造函数public static Mgr02 getInstance()   //3.得到实例{if(INSTANCE==null)     //两个线程同时访问,会new两个INSTANCE。{   INSTANCE=new Mgr02();}return INSTANCE;}//匿名的线程构造函数// thread().start();/*thread(()->).start();*/public void m(){ System.out.println("m");}public static void main(){for(int i=0;i<100;i++){new Thread(()->System.out.println(Mgr02.getInstance().hashCode())).start();}}  
}

3.加锁 synchronized

Public calss Mgr03
{  private static final Mgr03 INSTANCE;private Mgr03(){}                   public static synchronized Mgr03 getInstance()   //加锁synchronized{if(INSTANCE==null)     {   INSTANCE=new Mgr03();}return INSTANCE;}public void m(){ System.out.println("m");}public static void main(){for(int i=0;i<100;i++){new Thread(()->System.out.println(Mgr03.getInstance().hashCode())).start();}}  
}


4.加锁加强版 
5.防止指令重排序 volatile

Public calss Mgr05
{  private static final Mgr05 INSTANCE;private Mgr05(){}                   public static  volatile Mgr05 getInstance()   //volatile {if(INSTANCE==null)  //如果为空{ // 1.如果两个线程同时运行到此  那么会顺序的运行两次newsynchronized(Mgr05.class){if(INSTANCE==null)     //2.所以必须有这句{   INSTANCE=new Mgr03();}}}return INSTANCE;}public void m(){ System.out.println("m");}public static void main(){for(int i=0;i<100;i++){new Thread(()->System.out.println(Mgr05.getInstance().hashCode())).start();}}  
}