2012-10-28 54 views
1

我在Android應用程序中使用LinkedList,我遇到競爭條件。 1線程將數據添加到LinkedList,而另一個線程在檢索時刪除它們。我遇到了我從未處理過新添加的對象的情況。Java/Android:LinkedList競爭條件

我爲Google同步對象Google搜索,但無論是我想太容易,或者我失去了一些東西。從我讀過的內容來看,「對象同步」是兩者中較爲困難的,所以我想知道是否只用一段代碼來封裝同步(對象){};足夠?

所以,我有:

public void function addMove(Object move) { 
    synchronized(list) { 
    list.add(move); 
    }; 
}; 

public void function second() { 
    synchronized(list) { 
    // iterate through the list 
    list.clear; 
    }; 
}; 

這真的是我所需要的?

+0

請參見java.util.Collections.synchronizedList。 – ignis

+0

爲什麼不只是public void synchronized function()? – Shark

+0

您是否收到語法錯誤?我不熟悉方法聲明中的* function *詞。你可能只需要'public void addMove(Object move){...}'和'public void second(){...}'。 – Phil

回答

1

如果列表已正確封裝到對象中(即沒有其他對象可以訪問列表),並且如果這些是訪問列表的唯一方法,那麼是的,這就是您所需要的。

關鍵是每次訪問列表都必須在同步塊中完成。並且每個同步塊都必須在同一個對象上同步(在您的代碼示例中爲list)。

3

-在你的情況下,如果你的列表正確地與對象耦合,沒有其他方式來訪問它,除了這種唯一的方法,那麼我認爲這就足夠了。

-而且,下面的方法還可以用於:

public class Test{ 

private LinkedList<Object> list = new LinkedList<Object>(); 

public void function addMove(Object move) { 
    synchronized(this) { 
    list.add(move); 
    } 
} 

public void function second() { 
    synchronized(this) { 
    list.clear; 
    } 
} 


} 

////////////////////////// ////////編輯部分///////////////////////

-Synchronization做是爲了保護的關鍵狀態的數據應用methodatomic statements訪問其數據要被保護的field

-Every object具有一個且僅一個鎖,這是由thread來獲得訪問​​方法原子語句可存取其instance variables

-同樣every Class具有一個且僅一個鎖,這是由一個線程來獲得訪問​​方法原子語句可存取其static variable

-現在,當某對象的鎖執行thread獲得訪問權限,然後之後,它到達其synchronized方法或原子語句,訪問,如果在那個時候另一個線程試圖訪問同一對象鎖定 ,那麼線程被拒絕的訪問,並且它移動到blocked state

+0

謝謝。使用這種方法取代我的有什麼好處?它究竟做了什麼?它同步整個班級?這是否意味着如果2個線程正在訪問這個類中的一個變量,其中一個必須等​​待? (無論他們是否訪問相同的變量) –

+0

好的答案! @ user1750795,這確保了沒有''NullPointerException'與'sychronized'對象,同時提供了一個阻塞解決方案。 – Phil

+0

@ user1750795查看我編輯的答案 –

0

是的,這是如何控制線程訪問您的對象的方式。你所要做的就是看你的方法的時間。只有當數據添加到列表中時,才應該調用clear命令。

+0

爲什麼呢?爲什麼我不能打電話給clear()?如果它已經空了,沒有事情發生的權利? –

0

我不知道Android是否支持Java 5,但java.util.concurrent包含許多優秀的類來支持隊列,如ConcurrentLinkedQueue。