2012-09-27 46 views
1

我有一个线程,单例,android问题。Android Singleton Threadsafe

假设我们有以下单例代码。

public class Singleton { 
    private Singleton instance; 
    private int number1 = 0; 

    private Singleton() { 
     //lots of initialization code 
    } 

    public static synchronized Singleton getInstance() { 
     if(instance == null) { 
      instance = new Singleton(); 
     } 
     return instance; 
    } 
} 

我的问题。访问number1是否是线程安全的,还是需要创建一个带锁定机制的访问器?

感谢您的帮助。

回答

3

您的代码不会编译,因为instance不是静态的。声明应改为:

private static Singleton instance; 

除此之外,你已经建立了一个良好的机制,以确保您的应用程序只拥有Singleton一个实例。

但是,这样做并不会以任何方式保护您的成员变量number1。如果你从多个线程访问该成员变量,你仍然需要正确地同步事物。

+0

我明白了。谢谢您的意见。首选的方法是暴露一个锁对象,以便任何线程可以使用该锁,然后访问属性或访问器函数的锁定已经在其中? – DoubleDunk

+0

我会在你的'Singleton'类中完成所有的锁定,并且只是公开访问器。这样,如果需要,您可以在内部更改您的实施。 – wsanville

+0

@DoubleDunk - 他的意思不是声明'private Singleton实例;'你需要'静态私有Singleton实例;' - 因为你的静态getInstance()方法需要访问它。 – mah

5

使一个对象成为一个单例根本不会影响线程安全。如果您要从多个线程使用单例,您需要根据需要管理数据同步。

+0

谢谢你的回答。正如我怀疑我需要对我的数据类型进行同步。再次感谢。 – DoubleDunk

+0

@DoubleDunk请问为什么我的回答不被接受?我以为我回答了你(第一次),你明白了答案。如果你觉得wsanville的答案更有帮助,那么我完全尊重这一点,但如果你不介意的话,我希望了解它。想到我帮助过某个人,但却没有收到适当的反馈,真让人沮丧。 – mah

+0

你是对的,你的回答非常有帮助。但是,我觉得wsanville更详细,甚至更正了我的代码。如果有办法分裂我的答案。感谢您的帮助并相信我,我想分开答案。 :) – DoubleDunk