摘要:與同步方式在多線程情況下,可以采用同步阻塞悲觀鎖或樂觀鎖的方式實現業務,具體要看業務場景,如果重試的代價很小,那用是合適的,但如果每次重試都需要花費大量的時間或資源,那應該采用同步方式。
CAS介紹
CAS - Compare And Swap (Compare And Set, Check And Set)
wikipedia的描述如下:
比較并交換(compare and swap, CAS),是原子操作的一種,可用于在多線程編程中實現不被打斷的數據交換操作,從而避免多線程同時改寫某一數據時由于執行順序不確定性以及中斷的不可預知性產生的數據不一致問題。 該操作通過將內存中的值與指定數據進行比較,當數值一樣時將內存中的數據替換為新的值。
Java在sun.misc.Unsafe類庫里面的CAS實現。
以下源碼摘自java.util.concurrent.locks.AbstractQueuedSynchronizer。
/** * Atomically sets synchronization state to the given updated * value if the current state value equals the expected value. * This operation has memory semantics of a {@code volatile} read * and write. * * @param expect the expected value * @param update the new value * @return {@code true} if successful. False return indicates that the actual * value was not equal to the expected value. */ protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this //this: 當前對象 //stateOffSet: 偏移量,聲明在下面已貼出 //expect: 期待值 //update: 更新值 //如果stateOffSet的值與expect相等,則將stateOffset的值更新為update;并返回true。 //否則不更新,并返回false。 return unsafe.compareAndSwapInt(this, stateOffset, expect, update); } ...... private static final long stateOffset; static { try { stateOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField("state")); ...... } catch (Exception ex) { throw new Error(ex); } }CAS與同步方式
在多線程情況下,可以采用同步阻塞(悲觀鎖)或CAS(樂觀鎖)的方式實現業務,具體要看業務場景,如果重試的代價很小,那用CAS是合適的,但如果每次重試都需要花費大量的時間或資源,那應該采用同步方式。
以下是2種方式的簡單舉例:
class MyLock { private boolean locked = false; public synchronized boolean lock() { if(!locked) { locked = true; return true; } return false; } }
public static class MyLock { private AtomicBoolean locked = new AtomicBoolean(false); public boolean lock() { return locked.compareAndSet(false, true); } }CAS缺點 - ABA問題
進程P1讀取了一個數值A P1被掛起(時間片耗盡、中斷等),進程P2開始執行 P2修改數值A為數值B,然后又修改回A P1被喚醒,比較后發現數值A沒有變化,程序繼續執行。
解決思路:在每次更新的同時附上版本號,如:1A -> 2B -> 3A。JDK1.5開始新增的java.util.concurrent.atomic.AtomicStampedReference就是一種實現方式。
Redis中的CASRedis可以使用WATCH來實現對事務中鍵(可以是多個鍵)的監視,如果至少有一個鍵在EXEC執行前被改動,那么整個事務都會被取消, EXEC返回nil-reply來表示事務已經失敗。
具體參見:Redis - 事務(transactions)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69256.html
摘要:一簡介單點登錄,簡稱為,是目前比較流行的企業業務整合的解決方案之一。客戶端攔截未認證的用戶請求,并重定向至服務端,由服務端對用戶身份進行統一認證。三搭建客戶端在官方文檔中提供了客戶端樣例,即。 一、簡介 單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系...
摘要:所以客戶端的集成主要是單點登錄的集成,客戶端指定需要做安全認證的頁面,然后的安全包檢測校驗用戶登錄情況,并自動與登錄頁面進行跳轉交互。提供了很多配置的方式,有,,以及其他可查官網。但高度自由的一如既往的,沒有提供可視化操作的界面。 前兩篇介紹了Apereo CAS以及服務器端的安裝,但還不夠完整,服務端還沒有Application真正用起來呢!這篇文章將介紹怎么用起來 集成的目的 客戶...
摘要:客戶端與集成指定端口請求路徑用于單點退出,該過濾器用于實現單點登出功能,可選配置該過濾器用于實現單點登出功能,可選配置。該過濾器使得開發者可以通過來獲取用戶的登錄名。 CAS客戶端與SpringSecurity集成 pom.xml org.springframework spring-context 4.3.9....
JAVA單點登錄有好多種方式,譬如用cookie的domain做,用中間代理做等等,但都需要自行做許多開發工作。而其中耶魯大學的開源項目CAS提供了一個一站式解決方案,只需很少的擴展即可輕松實現企業級單點登錄。基礎知識網上其他挺多的,這里我就不詳述了。本文通過分析http請求過程中httpheader,cookie等數據剖析了cas(非代理模式,默認驗證邏輯。其他如restletAPI等可擴展邏輯...
摘要:這種情況通常發生在反向代理的時候,前端發起請求代理服務器,代理服務器發起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發階段使用dev-server,生產階段是打包成靜態文件整個放入后端項目中。 開發階段使用dev-server,生產階段是打包成靜態文件放入單獨的靜態資源服務器中,如nginx。 這兩種方案最大的區別就是生產階段。由于第...
摘要:這種情況通常發生在反向代理的時候,前端發起請求代理服務器,代理服務器發起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發階段使用dev-server,生產階段是打包成靜態文件整個放入后端項目中。 開發階段使用dev-server,生產階段是打包成靜態文件放入單獨的靜態資源服務器中,如nginx。 這兩種方案最大的區別就是生產階段。由于第...
閱讀 3062·2021-11-16 11:45
閱讀 3588·2021-09-29 09:34
閱讀 706·2021-08-16 10:50
閱讀 1576·2019-08-30 15:52
閱讀 1968·2019-08-30 15:45
閱讀 863·2019-08-29 15:23
閱讀 1929·2019-08-26 13:51
閱讀 3304·2019-08-26 12:23