我是java线程应用程序的新手请告诉我如何编写程序,每个线程在多线程应用程序中访问相同的对象列表?
有没有好的阅读链接?
答案 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/(已经在另一个答案中提到过)。