java基礎(chǔ)
cas自旋-基于內(nèi)存值的判斷
基于CAS操作的變量必須聲明為Volatile類型,這樣多線程操作,能保證線程1修改的值立馬在線程2中可以觀察的到。因此當(dāng)線程二讀取內(nèi)存塊的值作為預(yù)期值,然后進(jìn)行其他操作,同一時(shí)刻,線程1將內(nèi)存塊的值改變,線程2設(shè)置值的時(shí)候,發(fā)現(xiàn)內(nèi)存塊的值與預(yù)期的值不一致,就認(rèn)為操作失敗,已有線程修改。
JDK1.8中的ConcurrentHashMap就是采用此CAS算法保證高并發(fā)的線程安全。
CAS的弊端之一就是,線程1在把內(nèi)存塊值改掉一次,然后又修改一次恢復(fù)原來的值,其實(shí)這個(gè)時(shí)候已經(jīng)執(zhí)行了很多操作了,但是線程2認(rèn)為值沒有變,為預(yù)防此結(jié)果因采用版本號(hào)來判斷,沒修過一次自增1。