一、在分佈式狀況下,一個方法只能被同一個節點下的一個線程執行。redis
二、高可用的獲取鎖,釋放鎖。分佈式
三、高性能的獲取鎖,釋放鎖。性能
四、具備可重入性。spa
五、具有鎖失效機制,防止死鎖。線程
六、具有非阻塞特性,及若是沒有會去到鎖直接返回獲取鎖失敗。blog
大致思路:oneServer 去 resourceServer 上獲同步 resourceId,而後在 redis 上 執行 SETNX 命令,以這個 resourceId 做爲Key,存在redis 中,當oneServer完成業務操做以後刪除redis當中設置的key。當twoServer申請 resourceId 以前,首先去檢查 redis 是否存在已經存在 resourceId 佔用位置的 redis,若是存在返回resourceId已存在,等待 redis 釋放 resourceId,而後去resourceServer 去申請 resourceId,申請到以後重複 oneServer 的操做。資源
redis操做流程: oneServer 執行 SETNX 設置 resourceId 。當執行完成後執行 DEL。twoServer 執行 EXISTS 檢查是否存在 resourceId,若是存在返回resourceId已存在,若是不存在重複 oneServer 的操做。爲實現《鎖失效機制》,能夠使用 SETEX 命令設置鎖過時時間 替換 SETNX 命令佔用資源。同步
誤刪鎖:當在過時時間內 oneServer 操做未完成,所釋放了,而後 twoServer 獲取到了同步 resourceId,當oneServer執行完成,釋放resourceId,是否是把 twoServer 的 resourceId 刪除了。thread
解決方案:高可用
一、判斷是否是本身的鎖。 SETEX 設置 value 設置爲本身的 threadId,刪除時判斷是否是本身的鎖。
二、判斷是否處理完成,設置守護線程,判斷執行線程是否完成,當執行線程沒有執行完成時,設置延期,處理完成後下線守護線程。