解决方案 »

  1.   

    1、其实这里涉及到一个问题是
          同一个类被两个不同的ClassLoader加载的话,对于java虚拟机来说实际上认为是两个类。
    2、既然设计成单例的,那就不应该实现Serializable接口。其实说的这两个问题都是人为故意破坏程序的设计,程序不管怎么设计,都总是有问题的。
    不是有人说,从helloword程序中都能找到bug吗?没有十全十美的设计,比如说设计一个汽车,驾驶员硬是要往水里开,那能怪汽车设计人员说为什么不设计成禁止往水里开?
      

  2.   

    上述代码是怎么阻止用不同的classloader加载和发序列化的呢?
      

  3.   

    1、单例模式是个设计概念,不是一个实现概念,很多时候是没有必要注意一些特殊情况的,任何事物都有自己的作用域范围,你只要保证你的设计在你给定的作用域范围内正确就行。
    2、关于Classloader对于单例的冲突,大多数时候,多Classloader并不会造成所谓的单例模式冲突,因为觉得大多数的时候Classloader不会自己去实现,而默认实现都是有父子层级关系的(有关Classloader的类加载机制可以自己去查),因此加载的类几乎都在同一个域中,所以绝大多数情况不存在同一个类装载不同域的特殊情况。
    3、关于序列化是否会造成单例模式冲突,那么还是第一个观点的问解释,反序列化生成对象是无法阻止的,但是对应的你也可以用其它方式来完成单例模式的设计来规避这种风险,这只是具体实现的问题,问题在于你如何处理你所给定范围中设计的正确执行。
      

  4.   

    UNSAFE.allocateInstance(arg0);
    创建对象的方式有很多种,普通的单例只是防止通过new的方式产生第二实例。
      

  5.   


    Unsafe只能在hotspot上用,不靠谱,早已舍弃
      

  6.   


    Unsafe只能在hotspot上用,不靠谱,早已舍弃
    Unsafe不是Java规范包,因此不再考虑范围内,而且在1.7以后似乎已经弃用,非sun版本jdk也没这个玩意。
      

  7.   


    Unsafe只能在hotspot上用,不靠谱,早已舍弃
    Unsafe不是Java规范包,因此不再考虑范围内,而且在1.7以后似乎已经弃用,非sun版本jdk也没这个玩意。

    java8可用且功能更强大,但还是不建议用