阻止访问自己内部的特定属性 class

Block access to specifc attribute inside own class

我正在使用 public 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'

所以所有方法都必须像method1一样使用obj,避免直接调用method2

当然 java 没有修饰符可以做到这一点,但我想知道是否有注释或其他方式在编译时检查它...

----[一开始没说清楚,想多解释一下]----

您可以简单地将 class 一分为二:

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。但是请注意,这不是防弹的,仍然可以创建 FunctionalInterface 的自定义实现,它将保留接收到的 NotThreadSafe 实例并将其存储在堆中的某个位置,以便稍后访问它而无需Guard。然而,这是一个更大的努力,不太可能意外发生......