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;

相關文章
相關標籤/搜索