2012-01-24 30 views
1

我是新來的java線程應用程序請告訴我如何編寫程序,每個線程訪問多線程應用程序中相同的對象列表?如何在多個線程中訪問相同的arraylist

有什麼好的鏈接可以閱讀嗎?

+0

首先,訪問意味着什麼?你只是想讀取數組列表,或者想要使用多線程寫入它? – Sap

+0

@Grrrr我想讀取和寫入 – Boni

+0

這可能對您有所幫助http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util。名單) – Sap

回答

0

嘗試使用同一個實例訪問您的列表,或將其設置爲static並將其設置爲Synchronized以使列表線程安全。

0

您可以使用一個static列表,以便隨時只有一個副本。另外請確保使用同步方法進行線程安全。

0

要從所有線程訪問列表的同一個實例,請將其設置爲靜態。例如:

private static List myList; 

然後使訪問方法是線程安全的(即讓這個只有一個線程可以同時訪問它,這樣才能避免衝突)。例如:

public static synchronized updateList(String parameters) { 
    // Do something 
} 
1

您可以通過使用Collections類中的相關方法來確保您的List(或任何Collection)將是線程安全的。

the API

public static <T> List<T> synchronizedList(List<T> list) 
    Returns a synchronized (thread-safe) list backed by the specified list. 

例如

static List mySharedList = Collections.synchronizedList(new ArrayList()); 
0

是的,所有的線程能夠訪問任何對象的同一實例(包括類)。因爲每個應用程序(即每個進程)都會創建一個內存空間。然後一個進程包含內部的所有線程,包括。隱含的'主'',共享內存空間。

如果僅在一個線程中使用對象,則不存在任何併發問題。你不需要任何「同步」,鎖定等。但有時你可能不得不在線程之間共享某些東西。如果讀和寫都可以同時在幾個線程中完成,這意味着你需要同步這個對象來處理所謂的「賽跑」。

您不必爲共享對象創建一個字段爲static,以使它成爲線程安全的。如果有必要的話,你可以將這個對象作爲參數傳遞給一個擴展了Thread類的類(或者在匿名類的情況下它甚至可以是包含類方法的局部變量)

所以你只需要只需通過此對象進行同步。您可以同步顯式的方法中:

synchronized (obj) { 
    // doing a thread-safe stuff 
} 

,或者你可以做一個方法​​完全使用這種方法修改的OBJ的類。在這種情況下,它將被隱式和自動同步的方法的調用,如「同步(本){..}」塊:

public void synchronized methodFoo() { 
} 

至於讀,讀我「的Java技術手冊」,章節5.7 。 「線程和併發」。由於Java中所有多線程可能性的概述,對我來說非常有幫助。

在線資源中,官方Sun/Oracle的教程可能對初學者有所幫助:http://docs.oracle.com/javase/tutorial/essential/concurrency/(已在其他答案中已提及)。

相關問題