Java中的原子性指的是一個(gè)操作在執(zhí)行過(guò)程中不會(huì)被中斷的特性,就是說(shuō)當(dāng)一個(gè)操作開始執(zhí)行后,它要么全部執(zhí)行完畢,要么就不執(zhí)行。Java提供了一些基本數(shù)據(jù)類型,比如int、long等,這些數(shù)據(jù)類型的賦值操作是原子性的,因?yàn)檫@些數(shù)據(jù)類型的大小不超過(guò)處理器的寄存器的大小,可以被一次性讀取或?qū)懭雰?nèi)存中。
但是對(duì)于一些復(fù)合操作,比如說(shuō)++操作,需要對(duì)變量讀取和寫入兩次,因此就不能保證它是原子性的。這時(shí)Java提供了一些原子性操作類,比如AtomicInteger、AtomicLong,這些類提供了一些使用CAS(compare-and-swap)算法實(shí)現(xiàn)的原子性操作方法,可以保證復(fù)合操作的原子性。
//使用AtomicInteger操作一個(gè)計(jì)數(shù)器
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
事務(wù)原子性指的是一組操作要么全部執(zhí)行成功,要么全部不執(zhí)行,當(dāng)其中一個(gè)操作失敗時(shí),整個(gè)操作就會(huì)被回滾。在Java中,事務(wù)原子性通常是通過(guò)數(shù)據(jù)庫(kù)事務(wù)來(lái)實(shí)現(xiàn)的。在使用數(shù)據(jù)庫(kù)事務(wù)時(shí),只有當(dāng)所有的操作都執(zhí)行成功時(shí),整個(gè)操作才會(huì)生效。
//使用Spring的事務(wù)注解@Transactional來(lái)保證事務(wù)原子性
@Transactional
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
//從fromAccount扣除金額
fromAccount.withdraw(amount);
//向toAccount轉(zhuǎn)賬
toAccount.deposit(amount);
}