事務和原子操作

2021-08-30 08:45:15 字數 1581 閱讀 7433

原子操作是對乙個單一的物件(包括類域、陣列元素等永久物件)資料進行修改過程中發生斷電、嚴重異常等失敗情況時,保證原始資料的完整性,即恢復到初始資料狀態。事務操作是對一系列的永久資料更新的乙個邏輯的集合,要麼所有的永久資料的修改都正確完成,要麼所有的資料都被恢復為它們以前的值。

原子操作定義了乙個單一的物件、類域、陣列元素等進行修改的過程中發生斷電或異常等失敗情況之後,如何處理永久資料的內容。如果在修改的過程中發生斷電,當電源恢復時,該原子操作失敗的永久物件資料會恢復到最初的值。

例如:通過原子寫array_buf陣列元素。陣列的原始資料為: array_buf = [6, 7, 8, 9]。外部通過原子準備將陣列更新為:[1, 2, 3, 4]。當更新了兩個陣列原素: [1, 2]時發生斷電,此時,原子操作要求下次上電後需恢復到最初值,即: array_buf = [6, 7, 8, 9]。

原子操作的api:

如:util. arraycopy(byte src, short srcoff, byte dest, short destoff, short length)。該方法保證要麼所有的位元組都被複製了,要麼目標陣列被恢復為它以前的值。

事務操作是乙個對一系列的永久資料更新的集合,即將修改多個不同物件的幾個不同域或陣列元素。事務操作保證要麼所有的資料修改都正確的發生,要麼所有的域或元素都被恢復到它們以前的值。

例如:通過事務寫array_buf1陣列和array_buf2陣列。

步驟一通過原子寫array_buf1陣列元素。陣列的原始資料為: array_buf1 = [6, 7, 8, 9]。外部通過原子準備將陣列更新為:[1, 2, 3, 4]。正確完成,即: array_buf1 = [6, 7, 8, 9]。

步驟二通過原子寫array_buf2陣列元素。陣列的原始資料為: array_buf1 = [1, 1, 1, 1]。外部通過原子準備將陣列更新為:[5, 5, 5, 5]。當更新了兩個陣列原素: [1, 2]時發生斷電,此時,事務操作要求下次上電後需恢復事務中的所有陣列資料恢復到最初值,即: array_buf1 = [6, 7, 8, 9], array_buf2 = [1, 1, 1, 1]。

事務操作的api:

通過呼叫jcsystem.begintransaction()方法開始一系列的原子修改操作。從呼叫這個方法開始,每乙個物件的原子修改都是假定的修改。域或者陣列元素呈現的是已經被修改了(讀這些域或陣列元素將得到最後假定的值),但是這個修改還沒有提交。

當呼叫jcsystem.committransaction()方法時,所有的假定修改都被提交到永久儲存區,即乙個事務操作正確完成。如果在jcsystem.committransaction()完成之前發生掉電或其它的系統異常,所有假定修改的域或素組元素將被恢復到它以前的值。如果決定取消這個事務,可以通過呼叫jcsystem.aborttransation()方法在程式上撤消那些假定的修改。

end 

volatile和原子操作

所謂原子操作,就是 不可中斷的乙個或一系列操作 在確認乙個操作是原子的情況下,多執行緒環境裡面,我們可以避免僅僅為保護這個操作在外圍加上效能昂貴的鎖,甚至借助於原子操作,我們可以實現互斥鎖。很多作業系統都為int型別提供了 賦值的原子操作版本,比如 nt 提供了 interlockedexchang...

volatile和原子操作

標 題 volatile和原子操作 時 間 thu aug 6 12 16 53 2009 點 擊 26 所謂原子操作,就是 不可中斷的乙個或一系列操作 在確認乙個操作是原子的情況下,多執行緒環境裡面,我們可以避免僅僅為保護這個操作在外圍加上效能昂貴的鎖,甚至借助 於原子操作,我們可以實現互斥鎖。很...

原子性,原子操作

舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...