【问题标题】:Does adding "synchronized" affect method overriding?添加“同步”会影响方法覆盖吗?
【发布时间】:2014-09-24 03:31:16
【问题描述】:

我的问题是:

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), 这仍然是一种覆盖方法吗?它会起作用吗?

【问题讨论】:

标签: java overriding synchronized


【解决方案1】:

“一个方法是否同步是该方法的实现细节。同步没有在任何地方指定为声明性契约——你也不能在接口中同步。

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

取自here

【讨论】:

    【解决方案2】:

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

    更多详情见JLS-§9.4.1.3

    【讨论】:

      【解决方案3】:

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

      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"));
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 2018-07-26
        • 1970-01-01
        相关资源
        最近更新 更多