Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阻止访问自己的类中的特定属性_Java_Lambda_Annotations_Thread Safety_Access Modifiers - Fatal编程技术网

Java 阻止访问自己的类中的特定属性

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(); }

我正在使用一个公共JavaAPI来构建我的多线程应用程序,但是我不知道这个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”

所以所有方法都必须像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只为您提供了不清晰的内容