Java 阻止访问自己的类中的特定属性
我正在使用一个公共JavaAPI来构建我的多线程应用程序,但是我不知道这个API的一些方法是否是线程安全的(事实上我真的认为它们不是) 我一直在寻找最干净、最直接的方法来在代码中实现这种安全性,并决定使用lambda表达式 我打算用这样的东西:Java 阻止访问自己的类中的特定属性,java,lambda,annotations,thread-safety,access-modifiers,Java,Lambda,Annotations,Thread Safety,Access Modifiers,我正在使用一个公共JavaAPI来构建我的多线程应用程序,但是我不知道这个API的一些方法是否是线程安全的(事实上我真的认为它们不是) 我一直在寻找最干净、最直接的方法来在代码中实现这种安全性,并决定使用lambda表达式 我打算用这样的东西: public class Myclass { private NotThreadSafe obj; public Myclass() { this.obj = new NotThreadSafe(); }
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”
所以所有方法都必须像method1一样使用obj,避免直接调用method2
当然java没有修饰符,但我想知道是注释还是其他方式在编译时检查它
----[我第一次不太清楚,试图解释更多]-你可以简单地将课堂分成两部分:
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 */
}
这是您可以获得的最佳隔离,因为无法从
MyClass
直接访问obj
。但请注意,这不是防弹的,仍然可以创建功能接口
的自定义实现,该实现将保留接收到的NotThreadSafe
实例,并将其存储在堆中的某个位置,以便以后在没有保护的情况下访问它。然而,这是一个更大的努力,不太可能意外发生…什么是r?它以什么方式保证线程安全,而同步的线程安全已经没有了?@mk这实际上不是我问题的答案。@pvg它允许您传入任意代码,这些代码将在apiObjectNonThreadSafeObject
上操作。另一种方法是公开apiObjectNonThreadSafeObject
,但是不能保证使用它的代码会用synchronize
@mk将其包装起来,因为您可以将需要的任何内容传递给nonThreadSafedoodad。方法调用已经同步,lambda只为您提供了不清晰的内容