关于JAVA中的Synchronization和interface误用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JAVA中的Synchronization和interface误用相关的知识,希望对你有一定的参考价值。

最近在写一个手机小应用系统的业务模块有一些对抽象和接口的规划主要是接口部分一般情况下同类或同性质的事物我们都会将其抽离实现接口统一以便业务实现节环更灵活地使用。


课题如下

  在interface中声明 Synchronization 描述的方法是否可行要如何做


实际上Java 1.2以前的版本是允许这么做的

public interface DemoInterface{
    synchronization void function1();
}

然而1.2以后的版本就不行了且这么做是是错误的。接口(interface)就如其名一样只是“ 它们都是电梯”的标记但无论是使用方法还是物理构造都不一定是一样的即使开启的方法是同一个按钮但实现仅仅是同一个长得像或同叫一个名为“开关”的按钮就能启动而已。因此接口的意义就在于让人们不需要了解过多的细节而只需知道一个纯粹的作用---“开启”就行了。


说到这里可能会有鞋童问那抽象类Abstract class的用途跟接口有何区别事实上这要看你如何系统规划来决定何时、何地使用Abstract 或 interface的话题了。简单的解释有共同且一致的基本实现时使用Abstract这样实现类少一些代码编写量团队分工也容易维护也可控等等而需要照顾到更广泛的用途时且没有必要规定实现类的基本形态的情况使用interface最佳。


回到正题我的需求是有若干个算法实现它们有共同的使用入口接口 interface但不是所有实现都需要考虑线程同步当然也可以统一要求线程同步这时你会发现直接写一个抽象类让它们继承就行了正如前面的诉求只是入口相同即使用参列一致但实现方式不一定相同或部分同接口名称 却不需要线程同步的情况。

如下

public abstract DemoAbstract{
     synchronization void function1();
     synchronization boolean function2(){
         // ToDo
         .......
     }
 }
 
或者

public interface DemoInterface{
    synchronization void function1();
}

如果这么声明这是否正确先不说首先就已经违背了抽象思想吧我们这么做跟在抽象中就规定好它们的实现约定有什么区别不如直接写实现类好了没有必要再抽象你说对吗


在翻阅一些资料中找到了如下说明

Although the synchronized keyword can appear in a method header, it does not form a part of a method‘s API or contract. Synchronization is part of the implementation, not part of the interface.


关键的是红底部分文字这时说明了一切synchronization 应该是在实现类中使用于修饰具体的实现方法的而不应该在接口中。


以下附上一个样子供大家及自己复习

// 接口 
public interface ScientificTheory {  
  void publish();  
  void predict();  
  boolean falsifyThroughMeasurement();
  
}
// 实现类 LoopQuantumGravity1
public final class LoopQuantumGravity2 implements ScientificTheory {
  @Override
  public synchronized void publish() {    //..elided  }  
  
  @Override // 需要线程同步
  public synchronized void predict() {    //..elided  } 
   
  @Override 
  public boolean falsifyThroughMeasurement() {    return true; //stub 
  }
  
}
// 实现类 LoopQuantumGravity2
public final class LoopQuantumGravity2 implements ScientificTheory {  
  @Override 
  public synchronized void publish() {    //..elided  } 
   
  @Override //不需线程同步
  public void predict() {    //..elided  }
    
  @Override
  public boolean falsifyThroughMeasurement() {    return true; //stub 
  }
  
}


以上是关于关于JAVA中的Synchronization和interface误用的主要内容,如果未能解决你的问题,请参考以下文章

Java同步(Synchronization)

Synchronization和java内存模型

关于Java 中的 i += 1 和 i = i + 1 问题

jvm指令monitorenter,monitorexit与synchronization关键字

jvm指令monitorenter,monitorexit与synchronization关键字

golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,