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


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

不到的的影响。安全


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


private satic List<Task> taskQueue = Collections.SynchronizedList(new LinkedList<Task>()); 的方法,能够获得code

自己状态不是线程安全的容器的线程安全的状态,当是要注意,若是咱们牢牢只是在使用原子类型的操做队列

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

一些操做:非同步类的操做,比如以下。同步

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

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

,因此对于这种状况,咱们仍是须要本身去同步io

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


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

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

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

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

不听从此建议将致使没法肯定的行为。这里针对的是iterator;

相关文章
相关标签/搜索