2011-08-22 25 views
3

我需要某些操作才能成爲原子。java本地方法調用是原子調用?

這裏的'Atomic'表示「一旦該方法開始執行,它不應該中斷,直到它完成,即使線程調度程序也不應該使該線程在運行狀態下處於Runnable狀態」。

所有的方法都是Native方法,並且多個線程同時運行來執行這些方法。

第一個問題:本機方法執行本質上是原子嗎?

第二個問題:爲了實現Atomicity,我們可以使用java concurent/lock API,如果可以,請提供任何示例/鏈接(如果可能)?

謝謝。

+0

「原子」的定義有點偏離。這不是中斷,而是關於一致的數據。對於中斷或並行操作(特別是在多處理器上),您無能爲力,但您可以做很多事情來同步操作並保證一致的數據。你可以編輯你的問題來解釋*爲什麼*你想阻止中斷? – Gray

回答

2

如果我理解了正確的問題,您是在問:是否有可能實現某個線程始終在CPU上運行直至完成?要清楚的是,在那段時間內不應該被另一個線程取代。

答案是:即使它是(並且我不認爲它是),這與原子性無關。因爲如果你有多個CPU,多個線程仍然可以訪問和更改相同的數據,同時所有的線程都可以不間斷地真正運行。因此,即使你定義了「原子性」,你仍然會遇到併發問題。

如果你只是想要傳統意義上的線程安全,那麼是的,即使調用本地方法,也可以使用java-locks等來實現這一點。請參閱http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/sync.html以獲取本機方法內的Java線程同步示例。

-1

您對原子的定義是非標準的。這是更多standard definition

  1. 本地方法原子(通過您的非標準定義)?由於我可以在本地方法操作過程中的任何時候,拔出電源線並中斷執行,我會說本地方法是合理的非原子方法。
  2. 我們可以使用Java併發鎖定API在本地方法中實現原子性(非標準)嗎?如前所述,本地方法是不可原子的。沒有什麼可以幫忙
1

爲防止中斷,您必須使用機器代碼指令cli和sti來禁用和啓用中斷(在x86/x64上)。這不是你用普通的C語言甚至可以做的事情。

這是很低的水平,因爲它很少做。很大程度上是因爲它很少有用。主要關心的是通常與其他線程交互的行爲,這就是爲什麼Atomic是爲大多數用例定義的,而不是中斷方面的原子。

+0

感謝您的回覆,我根據您的回答理解的是,我們無法實現java原生方法和普通成員方法的執行的原子性,因爲它的層次太低,對吧?如果可能的話可以詳細說明這一點,請分享任何有用的鏈接呢? – SmartSolution

+1

請再次閱讀我的答案。你不明白答案的事實告訴我,你不明白你在問什麼。只有在非常具體和非常技術性的情況下才需要,如果你還不知道如何在'C'中使用'asm',我會懷疑你是否真的需要這個。 –