添加"同步"影响方法覆盖?

时间:2014-08-01 01:38:26

标签: java override synchronized

我的问题是:

search_text.addModifyListener(new ModifyListener() {
        @Override
        public void modifyText(ModifyEvent e) {
            ArrayList<Object> GPDMvalue = (ArrayList<Object>) multiSortList.getValue();
            ArrayList<Map<String, Object>> valueList = getDefaultValue(GPDMvalue);
            multiSortList.clear();
            if(getGPDMList().size()==0)return;
            multiSortList.setDataSource(getGPDMList());//new thread 1
            multiSortList.setDefaultOrAddValue(valueList);//new thread 2
        }
    });

当文本变化太快,并且线程1或线程2没有完全执行,并且可能有些问题,所以我想添加synchronized这样的 public synchronized void modifyText(ModifyEvent e), 这仍然是一种覆盖方法,它会起作用吗?

3 个答案:

答案 0 :(得分:5)

“方法是否同步是该方法的实现细节。同步不是作为声明性契约在任何地方指定的 - 它也不像您可以在接口中同步。

一个类如何实现它提供的任何线程安全保证取决于它。“

取自here

答案 1 :(得分:3)

添加synchronized关键字不会妨碍覆盖方法(它仍会被覆盖),因为method's signature保持不变。

有关详细信息,请参阅JLS-§9.4.1.3

答案 2 :(得分:3)

您可以覆盖已同步的方法,也可以删除synchronized关键字。

abstract class SynchronizedClass {
    public synchronized String myIterfaceMethod(String str){
        return str;
    }

}

public class OverrideSynchronozied extends SynchronizedClass{

    @Override
    public String myIterfaceMethod(String str){
        return str;
    }

    public static void main(String[] args) {
        SynchronizedClass ss = new OverrideSynchronozied();
        System.out.println(ss.myIterfaceMethod("Class Instance"));
    }

}