2015-12-14 90 views
3

我正在使用公共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作为方法1做,避免直接调用方法2

当然java doens't有一个修饰符来做到这一点,但我想知道是否是一种注释或其他方式来检查它在编译时...

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

+0

什么是r?它以什么方式保证已同步的线程安全? – pvg

+0

@mk这实际上不是我的问题的答案。 – pvg

+0

@pvg它可以让你传入任何代码,它将在'apiObjectNonThreadSafeObject'上运行。另一种方法是公开'apiObjectNonThreadSafeObject',但是不能保证使用它的代码会用'synchronize'来包装它。 –

回答

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 */ 

} 

这是最好的您可以从MyClass获得隔离,因为不可以直接访问obj。但请注意,这不是防弹的,但仍可以创建一个自定义实现FunctionalInterface,它将保留收到的NotThreadSafe实例并将其存储在堆中的某个位置,以便稍后访问而不需要Guard。然而,这是一个更大的努力,不太可能偶然发生......

相关问题