我在思考語言功能,我想知道以下功能是否已經在任何語言中實現。對象必須被鎖定才能使用?
一種聲明只能在互斥體中訪問對象的方法。所以,例如在java中,只有當它位於同步塊中並且在C#中有Lock時才能訪問該對象。
如果對象在Mutex塊之外使用,則會發生編譯器錯誤。
有什麼想法?
UPDATE
我覺得有些人誤解了這個問題,我不問你是否可以鎖定對象,我問,如果有一個物體的申報狀態的機構,它可能只能從鎖/同步語句中訪問。
我在思考語言功能,我想知道以下功能是否已經在任何語言中實現。對象必須被鎖定才能使用?
一種聲明只能在互斥體中訪問對象的方法。所以,例如在java中,只有當它位於同步塊中並且在C#中有Lock時才能訪問該對象。
如果對象在Mutex塊之外使用,則會發生編譯器錯誤。
有什麼想法?
UPDATE
我覺得有些人誤解了這個問題,我不問你是否可以鎖定對象,我問,如果有一個物體的申報狀態的機構,它可能只能從鎖/同步語句中訪問。
在Java中,您可以將關鍵字添加到方法中,但這只是語法糖,用於將整個方法主體封裝在synchronized(this)
-block(對於非靜態方法)中。
因此對於Java而言,沒有強制執行該行爲的語言結構。你可以嘗試.wait()
這個具有零超時,以確保調用代碼已經收購了顯示器,但是這只是檢查後 - 事實上
在Objective-C,你可以使用@property
和@synthesize
指令讓編譯器爲訪問者生成代碼。默認情況下,它們受互斥鎖保護。
有兩種方法可以做到這一點。
你的程序要麼拒絕運行一種方法,除非保護互斥鎖被調用線程鎖定(這是一個runtime check
);或者它拒絕編譯(這是一個compile time check
)。
第一種方法是C# lock
。
第二種方法要求編譯器能夠評估每個可能的執行路徑。這幾乎不可行。
如您所描述的對所有內容進行嚴格鎖定會造成死鎖的可能性,因爲人們可能會被迫更早地鎖定鎖定。
也就是說,有類似於您所描述的方法 - Software Transactional Memory,特別是通過允許回滾和重試來避免死鎖問題。