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

时间:2015-12-14 21:00:33

标签: java lambda annotations thread-safety access-modifiers

我正在使用公共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没有修改器可以做到这一点,但我想知道是否是一个注释或其他方式在编译时检查它...

---- [我第一次不清楚,试图解释更多] ----

1 个答案:

答案 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。然而,这是一个更大的努力,不太可能偶然发生......