在路上

路上有惊慌,路上有理想

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

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

posted on 2010-10-28 11:45 阮步兵 阅读(1989) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: