请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

synchronized 问题

public class Singleton6 {
private volatile static Singleton6 instance;

private Singleton6(){
}

public  static Singleton6 getInstance() {
    if (instance == null) {
        synchronized (Singleton6.class){
            if(instance == null){
                instance = new Singleton6();
               
            }
        }
    }
    return instance;
}

}
synchronized 加在方法上就没有重排序的问题了吗,synchronized 不是可以防止重排序的吗?

正在回答 回答被采纳积分+3

1回答

悟空 2019-10-25 15:31:06

你想问的是加在方法上,会不会有重排序的问题?如果加在方法上,两个线程会串行获取单例,不会有问题的,但是效率稍低一些。

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_雨声_2 #1
    synchronized 代码块内为什么会出现指令重排序呢,还是说synchronized 不能保证重排序?
    回复 有任何疑惑可以回复我~ 2019-10-25 15:35:51
  • 提问者 qq_雨声_2 #2
    能都这样理解,synchronized防止的是代码执行排序,但对每一行代码的多条机器指令是不能保证重排序的,而volatile 修饰变量后,对变量内部的机器指令instructions可保证不重排序
    回复 有任何疑惑可以回复我~ 2019-10-25 15:43:08
  • 悟空 回复 提问者 qq_雨声_2 #3
    synchronized 的加锁和解锁之间能够有确定的顺序,但是多个线程下,第一个线程还没退出synchronized之前,非空判断的时候不能保证顺序
    回复 有任何疑惑可以回复我~ 2019-10-25 16:08:12
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信