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很好,就不需要加了