維護有感3 -- 被濫用的synchronized

xfei6868發表於2009-12-07
同樣要先看一段程式碼,這是一段方法內部的程式碼:

StringBuffer temp = new StringBuffer(64);
synchronized (temp) {
String cgbh = Decoder.getParameter(request, "cgbh");

temp.append("INSERT INTO LWZZWCRXX (ID, XMBH, ZGH, XM) (SELECT ");
temp.append(" IDC_U_KYMIS.KY_XMRYXX_SEQ.NEXTVAL, CGBH, '");
temp.append(UserToken.getUserid(request)).append("','");
temp.append(UserToken.getUser(request).getUserName() + "'");
temp.append(" FROM ( ");
temp.append("SELECT NVL(TO_CHAR(MAX(TO_NUMBER(CGBH))), '").append(cgbh).append("' || '0000') CGBH");
temp.append(" FROM LWZZ WHERE CGBH LIKE '").append(cgbh).append("%'))");

return temp.toString();
}


先不說程式碼中變數的命名是否顯得蒼白,主要的問題就是這個synchronized 使用,
temp 是一個區域性變數,一個方法內的區域性變數,而java的方法的執行每次呼叫都會產生不懂的方法內區域性變數,那真不知道 synchronized (temp)的用處在什麼地方。

[size=medium][color=blue]補充:[/color][/size]

java中方法是執行緒安全的,對於區域性變數來說,根本沒有必要用synchronized,如果需要用到synchronized來做特殊處理,那肯定是自己的設計出了問題,要選擇修改自己的策略,而不是通過這樣的辦法。甚至本人覺得區域性變數的就是用StringBuilder也不需要做同步,用同步肯定自己策略本身就是危險的。

相關文章