![](/img/trans.png)
[英]How to get ArrayList shuffle to produce more than one not all the same
[英]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.