2012-01-24 36 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/(已在其他答案中已提及)。

相关问题