【问题标题】:what is the best pratice for Java to encapsulate thread-safe codeJava封装线程安全代码的最佳实践是什么
【发布时间】:2012-09-17 09:55:10
【问题描述】:

假设我有一个 ClassA,其职责是为外部使用提供线程安全的 API。并且某些 ClassA API 必须从另一个 ClassB 调用某些方法来完成某些逻辑(假设 ClassB 的方法是无状态且线程安全的)。但是,由于业务逻辑,ClassB 和 ClassA 不能合并为单个类。例如如下代码sn-p。有没有更好的方法来做到这一点?当然,我可以对 ClassA 使用更细粒度的并发控制,例如同步块、并发无锁数据结构。

谢谢!

public class ClassA{
   public synchronized void method1(ClassB cb){
     //do internal stuff1
     cb.printAlog();
     //do internal stuff2
   }
   public synchronized void method2(){
     //do internal stuff3
   }
   ......
}

public class ClassB{
   public void printALog(){
     //....
   }
   ......
}

【问题讨论】:

  • 如果ClassB是无状态的,为什么不把它作为ClassA的字段注入呢?

标签: java multithreading encapsulation


【解决方案1】:

这个问题没有意义。如果 B 类是无状态的,则根本不需要同步调用它。您只需要同步 A 类中需要同步的任何内容:您提供的信息准确为零。 B 类与此问题 100% 无关。

【讨论】:

  • 类绝对可以是线程安全的,例如不可变类
【解决方案2】:

据我理解的问题,您正在徘徊用线程安全类保护非线程安全代码。从这个角度来看,你提供的代码是完全合法的,只要你不以某种方式暴露classB,就有可能破坏classA的契约。

这个设计在Java concurrency in practice中也描述得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多