如何在多个线程中访问相同的arraylist

时间:2012-01-24 06:04:05

标签: java multithreading

我是java线程应用程序的新手请告诉我如何编写程序,每个线程在多线程应用程序中访问相同的对象列表?

有没有好的阅读链接?

5 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

尝试使用相同的实例访问您的列表或将其设为static并将其设为Synchronized以使您的列表具有线程安全性。

答案 2 :(得分:0)

您可以使用static列表,以便任何时候只能有一个副本。另外,请确保使用同步方法进行线程安全。

答案 3 :(得分:0)

要从所有线程访问列表的同一实例,请将其设置为静态。例如:

private static List myList;

然后使访问方法成为线程安全的(即使其成为只有一个线程可以一次访问它,以避免冲突)。例如:

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

答案 4 :(得分:0)

是的,所有线程都能够访问任何对象(包括类)的相同实例。因为在每个应用程序(即每个进程)的基础上创建了一个内存空间。然后一个进程包含内部的所有线程,包括隐含的'main',具有共享内存空间。

如果仅在一个线程中使用对象,则不存在任何并发问题。你不需要任何“同步”,锁定等。但有时你可能需要在线程之间分享一些东西。如果读取和写入都可以同时在几个线程中完成,则意味着您需要通过此对象进行同步以处理所谓的“赛车”。

您不必为共享对象创建static字段以使其成为线程安全的。如果有必要,您可以将此对象作为参数传递给扩展Thread类的类(或者在匿名类的情况下它甚至可以是封闭类方法中的局部变量等)。

所以你只需要通过这个对象进行同步。您可以在方法中明确同步:

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

或者您可以使用此类方法修饰符完全为obj的类创建方法synchronized。在这种情况下,它将在调用方法时隐式自动同步,如“synchronized(this){..}”块:

public void synchronized methodFoo() {
}

至于阅读,我读了第5.7章“果壳里的Java”。 “线程和并发”。由于概述了Java中的所有多线程可能性,这对我非常有帮助。

在线资源中,官方Sun / Oracle的教程可能对初学者有用:http://docs.oracle.com/javase/tutorial/essential/concurrency/(已经在另一个答案中提到过)。