繁体   English   中英

如何在多个线程中应用程序访问同一数组列表

[英]How to Application access same arraylist in more than one thread

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

有什么好的阅读链接吗?

通过使用Collections类中的相关方法,可以确保List(或任何Collection)是线程安全的。

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());

尝试使用相同的实例访问列表,或使其变为静态并使其同步,以使列表成为线程安全的。

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

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

private static List myList;

thread can access it at one time, so as to avoid conflicts). 然后,使访问方法成为线程安全的(即,使其成为线程一次只能访问它,以免发生冲突)。 例如:

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

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

如果仅在一个线程中使用对象,则不会有任何并发​​问题。 您不需要任何“同步”,锁定等操作。但是有时您可能必须在线程之间共享某些内容。 如果读写可以同时在几个线程中完成,则意味着您需要通过该对象进行同步以处理所谓的“竞赛”。

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

因此,您只需要通过此对象进行同步即可。 您可以在方法内部显式同步:

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

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

public void synchronized methodFoo() {
}

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

在在线资源中,Sun / Oracle的官方教程可能对初学者有所帮助: http : //docs.oracle.com/javase/tutorial/essential/concurrency/ (已在其他答案中提到)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM