码迷,mamicode.com
首页 > 其他好文 > 详细

6.synchronized的使用注意点

时间:2021-04-14 11:58:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:没有   void   print   pac   失败   asi   read   highlight   vol   

先来个单例模式的线程安全代码

package basic.single;

public class SingleTon {

  private SingleTon(){
    System.out.println(Thread.currentThread().getName());
  }

  private static volatile SingleTon singleTon;

  /*public static SingleTon getInstance(){
    if(singleTon == null){
      synchronized (SingleTon.class){
        if(singleTon == null){
          singleTon = new SingleTon();
        }
      }
    }
    return singleTon;
  }*/

  public static synchronized SingleTon getInstance(){
    if(singleTon == null){
      singleTon = new SingleTon();
    }
    return singleTon;
  }

  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      new Thread(()->{
        SingleTon.getInstance();
      }).start();
    }
  }

}

  

我们可以看到,加在方法上面一次就行了,因为虚拟机在执行方法的时候会加锁。

但是使用注释的代码那边,这种叫多线程双重校验,这里由于方法上没有关键字,导致多个线程同时锁住SingleTon.class,导致单例失败。所以我们在使用这种代码块锁的时候要额外注意。

注意:volatile 这个关键字的使用是个加分项。

6.synchronized的使用注意点

标签:没有   void   print   pac   失败   asi   read   highlight   vol   

原文地址:https://www.cnblogs.com/johnzhao/p/14654208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!