代码之家  ›  专栏  ›  技术社区  ›  CoolBeans Jake

初始化静态成员的单例

  •  0
  • CoolBeans Jake  · 技术社区  · 15 年前

    在下面的代码片段中,当我最初设计它时,“下一个数字”需要在整个应用程序的执行过程中发送下一个递增的值。所以我把这门课改成了单门课。不过,由于最近的一些要求变化,我需要对“下一个号码”进行重置。我刚刚添加了一个重置方法。但是,它绝对违反了Singleton模式,而且我知道这样初始化静态成员不是一个好主意。

    你觉得我应该怎么做?

    public final class GetNextNumber {
        private static GetNextNumber instance; 
        private static Integer nextNumber=1;
        private GetNextNumber() {
        }
        public static synchronized GetNextNumber getInstance() {
            if(instance==null){
                instance = new GetNextNumber();
            }
            return instance;
        } 
        protected Integer getNextNumber(){
            return nextNumber++;
        }
        protected synchronized void reset(){
            nextNumber=1;
        }
        public Object clone() throws CloneNotSupportedException {
            throw new CloneNotSupportedException();
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   MeBigFatGuy    15 年前

    为什么字段不只是实例变量?这里不需要静电。

    重置也不需要同步,除非getNextNumber也是。

        2
  •  2
  •   Richard Fearn    15 年前

    • getNextNumber 不是 synchronized .
    • 自从 getNextNumber编号 reset 不是 static , nextNumber 不需要 ,也可以。

    AtomicInteger 为了避免让你 getNextNumber编号 重置 同步的 :

    public final class GetNextNumber {
    
        private static GetNextNumber instance;
    
        private AtomicInteger nextNumber = new AtomicInteger(1);
    
        private GetNextNumber() {
        }
    
        public static synchronized GetNextNumber getInstance() {
            if(instance==null){
                instance = new GetNextNumber();
            }
            return instance;
        } 
    
        protected Integer getNextNumber(){
            return nextNumber.getAndIncrement();
        }
    
        protected void reset(){
            nextNumber.set(1);
        }
    }
    

    有关此问题的进一步讨论,请参见 The Atomic classes in Java 5: AtomicInteger and AtomicLong

    在Java5之前,我们必须编写类 在中访问计数器变量 同步的 否则使用 volatile 一种较轻的同步形式,但是 可能会有一些更新 如果同时发生,就要错过。 原子整数 提供 两全其美。。。