设计一个抽象类,该类的一个抽象方法需要同步控制,不知道应该如何做才好?

解决方案 »

  1.   

    abstract方法是不能声明为synchronized的,应该在子类中提供该方法的实现时,再声明synchronized。原因很简单,你在abstract类中尚不知道如何实现该方法,哪里来的同步需求呢?
      

  2.   

    类的前面是不可能加上synchornized的,这个关键字就不是修饰类的。
      

  3.   

    如果abstract方法是不能声明为synchronized的,请帮忙设计一下这个抽象类吧。
    我需要在抽象类里限制抽象方法的并发访问,以免使用该抽象类的其他人员访问出错。
      

  4.   

    public abstract class Test 
    {
    public final synchronized void method() {
    methodImpl();
    }
    protected abstract void methodImpl();
    }method()方法开放给一般使用人员,子类在methodImpl()方法中实现需要的功能。
      

  5.   

    坦率的说就解决方案来说,gtlang78()是个方法,但不是个好方法,第一,public接口是一个承诺,每实现一个public接口都必须慎重考虑,尤其是在abstract class中,因为虚类正是为了继承而存在的,如此public的实现就更加慎重之又慎了,不要因为期望实现某种功能而强行定义接口。第二,abstract method正是为了让其下继承的对象自行选择其实现方式,一般abstract method的设计者很难对具体功能做出超前的判断,既然必须由子类实现,自然也应该由子类自我决定该method是否应该被实现synchronized,所以对abstract method进行synchronized不是一个好主意。
      

  6.   

    我需要在抽象类里限制抽象方法的并发访问,以免使用该抽象类的其他人员访问出错。既然你的抽象方法现在只是个声明,具体它在子类中会干什么,你一点也不知道,你似乎没必要担心上面的问题。如果它确实需要同步,子类实现者自然会考虑到,如果不需要同步,你在父类中加以限制就显得多余了。我也意识到 gtlang78() 的方法有问题了,虽然methodImpl被声明为protected,但这不能阻止在子类中将它覆盖为public,这样,使用子类的人就会直接调用methodImple,而绕过method我还是坚持我最初的观点吧。呵呵。