给静态方法加同步锁

                                               给静态方法加同步锁

     我们知道利用synchronized关键字可以解决线程安全的问题,synchronized可以加在代码块中,也可以加在同步方法中。synchronized加在方法中的时候等价于:

synchronized(this){

     对共享资源进行操作的代码块

}

问题:静态方法的锁加在什么对象上呢?

        加锁的时候要传一个Object对象,但是static修饰的方法在加载的时候是没有new出对象的,实际上这个锁是加在当前类的字节码对象上。

 

单利设计模式有2种:

1.饿汉式

public class Singal{ 
     private static final Singal singal = new Singal();
       private Singal(){};
      private static Singal getInstance()
      { 
             return singal; 
    }  
  }

 2.懒汉式

      有人觉得上面那种的效率不是很高,于是就出现了下面一种,简称懒汉式

  优点是可以实现延迟加载,效率高。

 

public class Singal {
        public static Singal singal = null;
	private Singal() {};
	private static Singal getInstance() {
	   if (singal == null) {
		singal = new Singal();
	    }
	return singal;
     }
}

 分析:红色标记的这段代码会出现线程安全问题

       当if(singal==null)这段代码执行完后,另外一个线程也抢到了cpu的执行权
并执行完,生成了一个Singal对象。等原线程回过头也会生成一个Singal对象。

这样就生成了2个singal对象了,线程安全问题也就这样产生了。 

 

注:对上面代码进行优化后,就不会出现线程安全问题,但是锁是加在当前类的字节码

        对象上的。

 public class Singal {
     // 懒汉式有延迟加载的功能,但是会出现线程不安全的问题。
public static Singal singal = null;
private Singal() {};
private static Singal getInstance() {
    synchronized (Singal.class) {
            if (singal == null) {
                      singal = new Singal();
           }
      }
    return singal;
  }
}

          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值