Java封装线程安全代码的最佳实践是什么?

时间:2012-09-17 09:55:11

标签: java multithreading encapsulation

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

谢谢!

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(){
     //....
   }
   ......
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

此设计也在Java concurrency in practice中得到了很好的描述。