2015-12-14 62 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。然而,這是一個更大的努力,不太可能偶然發生......