关于单身人士设计不佳

时间:2012-08-08 15:07:53

标签: java multithreading

我有一个类是下面的一个..

public class DataBaseDAO { 
    private DataBaseDAO() { }
        public static synchronized DataBaseDAO getInstance() {
            if (dao == null) {
                dao = new DataBaseDAO();
                }
            return dao;
            }
        }
    }

现在这个getinstance()方法可以被黑客攻击:换句话说,这个单例可以被黑客入侵,并且可以创建更多的对象。

如何确保安全? 这可以通过反思,类加载器和deserilizaton来打破 我应该使用同步块而不是在整个方法上进行同步吗? 它会对性能产生影响吗?

感谢大家,实际上我不想介绍新的枚举,因为在现有的结构中会发生很多变化,我正在寻找如何用现有的方法改进现有的单片......

4 个答案:

答案 0 :(得分:2)

您可以使用

更安全地做同样的事情
public enum DataBaseDAO { 
    INSTANCE
}

e.g。您可以使用反射来使用setAccessible(true)的私有构造函数,但不能创建新的枚举实例。

而不是

DataBaseDAO.getInstance().whateverMethod()

你可以使用

DataBaseDAO.INSTANCE.whateverMethod()

答案 1 :(得分:1)

实际上你应该担心让你的单身被黑客攻击。一般来说,单例被认为是一种糟糕的(过时的)设计实践(它们往往会妨碍声纳或更晚,导致可扩展性问题并使测试变得不必要地复杂化。)

您已经定义了一种清晰的访问方法,它不是您(作为设计师或程序员)的责任,以防止聪明的黑客不顾一切地滥用您的单身人士。有一些项目指南可以防止这种情况发生。

答案 2 :(得分:0)

答案 3 :(得分:0)

以下3种方法都是安全的,前两种是通过类加载机制,最后一种是通过同步。

除非你使用SecurityManagers,否则你无法保护自己免受反射,我觉得这很复杂。

另一个注意事项:不要使用单身人士;-P

class YourClass
{
    public static final YourClass instance = new YourClass();
}

// or

class YourClass2
{
    private static final YourClass2 instance = new YourClass2();

    public static synchronized YourClass2 getInstance()
    {
        return instance;
    }
}

// or

class YourClass3
{
    private static YourClass3 instance;

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