對java synchronized 關鍵字的理解二

近日,有位同事寫了一段線程同步代碼,卻發現實際上沒有啓作用。上代碼

public String getSerialNo(String requestId) throws ServiceException {
    String serialNo = "";
try {
synchronized(requestId) {
//------------業務邏輯處理
}
} catch (DaoException e) {
throw new ServiceException("getSerialNo DaoException" , e);
}
return serialNo;
}
看上去,第一感覺這個是調用傳的對象問題,就是String 對象不是同一個。這就又牽涉到String對象生成的問題了,上篇文章中其中有提到

http://blog.csdn.net/yysct2005/article/details/8876906

那就順着這個思路來吧,這個方法的調用方呢?經瞭解得知,這是一個遠程方法調用的實現類的接口調用。這也就牽涉到序列化實現機制了,使用的是Hessian2序列化。

那也就成了對同一個值相等的String對象,序列化生成的String是怎麼生成的問題。

總之,說明了,同步加在了不同的對象上面導致的問題。

這麼多場景下(在不知外部系統怎麼來調用),怎麼更好滴使用同步關鍵字,有好的實踐方式:

封閉原則-----此類代碼同步僅限於本類實現。對外部透明,並不依賴外部。

對象的鎖建議選定new Object 方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章