1.迭代問題
多線程環境下,迭代容易引起問題,如
for(int i=0;i<v.size();i++){System.out.println(v.get(i))}
解決辦法之一:
客戶端加鎖
for(int i=0;true;i++){
Sychronzied(v){
if(i<v.size()){
System.out.println(v.get(i)
}
}
},當然這種也有問題,一旦程序可以重新設置元素位置,也會出錯。
幸好有一種比較安全的辦法: copy遍歷對象
Sychronzied(v){
Object v_clone= copy(v);
}
iterateV(v_clone);
2.Singleton
單例習慣的方式,采用延時初始化,
public static A getInstance(){
if(null==instance){
instance=new A();
}
return instance
}
在多線程模式下,需要加鎖,來保證同步Sychronized(object){}。
如果初始化對象并不占用太多資源,其實沒有必要加鎖,畢竟同步也是很耗資源的。取消延時初始化,priavte static final instance=new A();
3.順序化資源
順序化資源是避免死鎖的簡單的方式。
死鎖:T1時間,線程A 擁有objA的鎖,請求objB的鎖。線程B擁有objB的鎖,請求objA的鎖。
如: System.identityHashCode(objA)<System.identityHashCode(objB)
或者:public sychronized add(A a){sychronized(a){//do something}}
4.wait and notify
為了防止等待-通知機制出現race condition,需要加sychronized
race condition:objA在被wait之前已經被另一線程objB 給notify 了, 之后的wait 會永久停止,并導致deadlock(死鎖),當然,如果你確認可以控制wait-notify很好,就不需要加了