1. 纯静态属性和纯静态方法类,如果同样将构造函数私有, 看上去都吥需要去new一个对象了, 好像还比单例省资源哦!
2. 单利模式的懒汉式一般建议在静态方法中加了一个同步!,  奇怪的是同步是针对对象而言的,而却在一个静态方法上加上了synchronized , 这也是让人较费解的一个问题之一!
3. 为了在静态方法中使用那个单例模式对象, 只有将它设置成为了静态属性; 到底这样的同步有何用哎?。。

解决方案 »

  1.   

    哦!明白
    这是为了防止多个单例出现:
    不用同步处理方式在单线程的模式下可以很好的运行;但是在多线程模式下,可能产生问题。如果第一个线程发现成员变量为null,准备创建对象;这是第二 个线程同时也发现成员变量为null,也会创建新对象。这就会造成在一个JVM中有多个单例类型的实例。如果这个单例类型的成员变量在运行过程中变化,会 造成多个单例类型实例的不一致,产生一些很奇怪的现象。例如,某服务进程通过检查单例对象的某个属性来停止多个线程服务,如果存在多个单例对象的实例,就 会造成部分线程服务停止,部分线程服务不能停止的情况。 
      

  2.   

    1.首先纯static方法的类就不太符合oo思想,如果都用static和面向过程有什么区别呢?2.同步和对象没有必然关系,主要是在多线程的时候避免产生数据不同步和脏数据。而且也正因为是static的方法才更有必要加上synchronized,避免多个线程同时调用产生问题。当然如果你确定这个方法多线程调用也没有问题也可以不.如果你只有一个线程调用这个方法当然也可以不加,但是加了synchronized不用多线程也没什么损失,所以一般还是加上吧。
      

  3.   

     奇怪的是同步是针对对象而言的, 而却在一个静态方法上加上了synchronized , 这也是让人较费解的一个问题之一其实静态方法加上了synchronized 是有锁住对象的,当然锁住不是本身那个对象,而是本类所属的那个Class对象,如Foo类,静态方法加synchronized锁住的对象应该是Foo.getClass()返回的Class类的对象; 
      

  4.   

    class Foo{  public synchronized void m1()
      {
          ........
       }   public synchronized static void m2()
      {
          ........
       }
    }上面列子的两个同步锁住的是不同对象的,m1()为this,m2()为Foo.getClass(),因此如果这两个函数共享了相同的变量时,那么这个类就不是线程安全的。