我正在使用公共java API来构建我的多线程应用程序,但我不知道这个API的某些方法是否是线程安全的[确实我认为它们不是]。
我一直在寻找在我的代码上实现此安全性的最干净和直接的方法,并决定使用lambda表达式。
我打算用这样的东西:
public class Myclass {
private NotThreadSafe obj;
public Myclass() {
this.obj = new NotThreadSafe();
}
private synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
private void method1() {
this.useNonThreadSafeObject((NotThreadSafe p)->{/*do stuff*/};);
}
private void method2() {
this.obj.someMethod();
}
/* any other methods */
}
我想确保Myclass中的任何方法都不会直接调用'obj'
所以所有方法必须使用obj作为method1,避免直接调用method2
当然java没有修改器可以做到这一点,但我想知道是否是一个注释或其他方式在编译时检查它...
---- [我第一次不清楚,试图解释更多] ----
答案 0 :(得分:2)
您可以简单地将班级分成两部分:
class Guard {
private final NotThreadSafe obj;
public Guard() {
this.obj = new NotThreadSafe();
}
synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
}
public class Myclass {
private Guard guard=new Guard();
private void method1() {
guard.useNonThreadSafeObject(p -> {/*do stuff with p*/});
}
private void method2() {
guard.useNonThreadSafeObject(p->{/*do other stuff with p*/});
}
/* any other methods */
}
这是您可以获得的最佳隔离,因为obj
无法直接访问MyClass
。但请注意,这不是防弹,仍然可以创建FunctionalInterface
的自定义实现,它将保留收到的NotThreadSafe
实例并将其存储在堆中的某个位置,以便以后访问它Guard
。然而,这是一个更大的努力,不太可能偶然发生......