Java基础【Java的容器的线程安全问题】


 线程安全: 多个线程在操作共享的资源,比如说我们的容器的时候。互相之间会带来意想

不到的的影响。


在jdk之中,有一些容器是线程安全的,有一些容器则不是。利用如下的方法:


private satic List<Task> taskQueue = Collections.SynchronizedList(new LinkedList<Task>()); 的方法,可以得到

本身状态不是线程安全的容器的线程安全的状态,当是要注意,如果我们紧紧只是在使用原子类型的操作

比如 : queue.poll(obj); 那么我们在Conllections.SynchronziedList方法中调用后,poll将处于同步状态。对于lingwai的

一些操作:非同步类的操作,好比如下。

    if(! queue.isEmpty())
    {    
        queue.poll(obj);
    }

   在这里我们很难保证,在调用了isEmpty()以后,在poll之间,这个queue队列有没有别修改

,所以对于这种情况,我们还是需要自己去同步

    synchronized(queue) {  
       if(!queue.isEmpty()) {  
           queue.poll(obj);  
       }  
   }


对于Collections.synchronizedList(new LinkedList<Task>()),

在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:

List list = Collections.synchronizedList(new ArrayList()); 

... synchronized(list) 
{ Iterator i = list.iterator(); 
// Must be in synchronized block while (i.hasNext()) foo(i.next()); }

不遵从此建议将导致无法确定的行为。这里针对的是iterator;



转载于:https://my.oschina.net/infiniteSpace/blog/303701

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值