背景:給智慧型櫃加上鎖,保證多個使用者同時存物的時候,不會出現多個人開啟同乙個智慧型櫃門的情況
synchorized介紹:synchorized包含兩個部分,乙個是鎖,乙個是被鎖的內容
當多個執行緒到達synchorized時,會判斷他的鎖,如果該鎖正在使用中,那麼他就要等待使用的人用完了才可以用該鎖進去,沒被使用的話則可以直接訪問。
ps:使用鎖需要注意的是鎖不能有多個。即鎖之間要全等。例如a、b同時訪問鎖內容,需要保證鎖一樣才會排隊。例如a的鎖是字串「a」,b的鎖也是字串「a」,如果「a」=="a",那麼就會排隊,如果兩個「a」是兩個物件則不會排隊
鎖的幾種用法,
鎖的位置
鎖鎖的內容
例子普通方法上
類例項物件
該普通方法
public synchronized string getlocker(long smartarkid)
靜態方法上
類本身該靜態方法
public static synchronized string getlocker(long smartarkid)
**塊上
括號內的內容
大括號內的內容
synchronized (lockerpool.getinstance().getlocker(smartarkid))
當synchorized加在方法上面,那麼鎖就是該例項物件(new了多少個物件就有多少個鎖),如果兩個執行緒的例項物件一致的話,那沒就會排隊
當synchorized加在靜態方法上,那麼鎖就是該類本身(一把鎖),不論例項有多少個,都會排隊。
當synchorized加在物件上,那麼鎖就是該物件(小括號內的內容)。如果小括號裡面的是類,就是類鎖,全域性乙個(this.getclass或者lockerpool.class,this.getclass獲取當前類,類名.class獲取指定類)。如果小括號裡面的是例項物件,那就是例項鎖,(this)
示範一:
第一步,設定鎖
第二步,需要加鎖的內容加上鎖
如上所示,使用的類本身作為鎖,保證獲取smartarkmap為同乙個,再用smartarkmap作為鎖保證每個智慧型櫃開啟的時候都會排隊依次開啟
執行結果
示範二:
第一步設定鎖
需要加鎖的內容上鎖
下圖是鎖的實現,使用的單例模式下的類例項物件
如上所示,我設定了鎖池smartarkmap記錄全部的鎖,同時為了防止lockerpool出現多個,我設定了單例。為了防止使用者獲取鎖的時候出現同步,我在獲取鎖的方法上也加了鎖(這個鎖是lockerpool,鎖的內容就是getlocker方法)
使用jmeter進行測試,同時呼叫7次該介面
可以看出,當第乙個執行緒結束時已經有3個程序進來了,但是他們都等到第乙個程序進去以後才開始開箱,資料庫也保證了每個箱子都沒有重複開啟。該測試重複了20次,每次都是同時呼叫7次介面,未出現重複情況
ps:本來打算計畫寫錯誤方法的,寫了一種後,想想錯誤的還是不要寫詳細了,說說吧。剛開始synchorized我是加在serviceimpl裡面的,多次執行時有概率出錯,加在controller後未出現該情況(或許是serviceimpl執行結束了但是還未存放到資料庫?)synchorized後面的獲取例項方法未加鎖,導致執行時出現同時呼叫該方法,同時進去鎖的內容裡面的情況
iOS description方法的使用介紹
在輸出字串 一些基本資料型別以及 oc 物件,我們都可以使用 nslog 函式進行輸出。本次主要談談使用nslog輸出 oc 物件的應用。一般情況下,我們在使用nslog 和 輸出某個物件時,就會呼叫這個物件的 description 方法,它的返回值就是 nsstring 字串型別,所以 desc...
python paramiko的使用簡單介紹
設定ssh連線的遠端主機位址和埠 t paramiko.transport ip,port 設定登入名和密碼 t.connect username username,password password 連線成功後開啟乙個channel chan t.open session 設定會話超時時間 cha...
Linux使用SVN server的簡單介紹
晚上回宿舍沒事做,在一台機器上裝了乙個ubuntu用來玩,順便裝了svn server端,下面簡單介紹一下svn server的使用 1 安裝svn server 這個有太多的資料了。2 安裝好svn server後,就啟動了 svnserve d r svnrootdirectry其中svnroo...