单例模式与synchronized

104 篇文章 2 订阅

单例模式中的懒汉模式,通常看到代码如下:

public class Person {
    private static Person mInstance;

    public static Person getInstance(Context context) {
        if (null == mInstance) {
            mInstance = new Person();
        }
        return mInstance;
    }
}

上述代码其实属于线程不安全的懒汉模式,原因在于无法对多线程调用进行控制:
1、线程A希望使用Person,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,

2、线程B开始执行,它也要使用Person,调用getInstance()方法,同样检测到instance是null——注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象——因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个Person对象,最终导致单例失败!

要实现线程安全的单例,方法很简单,就是将这个getInstance方法加锁,一个线程必须等待另外一个线程创建完成后才能使用这个方法,这就保证了单例的唯一性。

public class Person { // 推荐
    private static Person mInstance;

    public static Person getInstance(Context context) {
        if (null == mInstance) {
            synchronized (Person.class) {
                if (null == mInstance) {
                    mInstance = new Person();
                }
            }
        }
        return mInstance;
    }
}

public class Person {
    private static Person mInstance;

    public static synchronized Person getInstance(Context context) {
        if (null == mInstance) {
            mInstance = new Person();
        }
        return mInstance;
    }
}

   两个并发线程访问同一个对象obj中的synchronized修饰的一个方法时,一个时间内只能有一个线程得到执行,即A操作完才可以让B操作,否则B一直处于等待的状态中,也可以说是一种阻塞的状态。


synchronized优缺点

  • 优点是将解决多线程的问题,避免占用资源,占用多个对象。
  • 缺点是会锁住某一段程序,别的程序如果需要调用的话就必须等待,减少了速度、效率。有可能产生死锁,导致程序中断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值