Java 作为局部变量创建对象
我一直在阅读,我发现无论在代码上创建对象的位置,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建的。我想知道在本例中,执行Java 作为局部变量创建对象,java,multithreading,concurrency,Java,Multithreading,Concurrency,我一直在阅读,我发现无论在代码上创建对象的位置,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建的。我想知道在本例中,执行doSomething()时创建的ArrayList是否会在产生并发问题的线程之间共享,或者在堆中创建两个不同的实例 public ArrayList<T> doSomething(){ ArrayList<T> list = new ArrayList<>(); //...Add content to
doSomething()
时创建的ArrayList
是否会在产生并发问题的线程之间共享,或者在堆中创建两个不同的实例
public ArrayList<T> doSomething(){
ArrayList<T> list = new ArrayList<>();
//...Add content to the list
return list;
}
public void printList(ArrayList<T> list){
for(T element: list)
System.out.println(element);
}
Thread thread1 = new Thread(new Runnable{
public void run(){
printList(doSomething());
}
}
Thread thread2 = new Thread(new Runnable{
public void run(){
printList(doSomething());
}
}
thread1.start();
thread2.start();
public ArrayList doSomething(){
ArrayList=新建ArrayList();
//…将内容添加到列表中
退货清单;
}
公共作废打印列表(ArrayList列表){
对于(T元素:列表)
系统输出打印项次(元素);
}
线程线程1=新线程(新可运行{
公开募捐{
打印列表(doSomething());
}
}
线程线程2=新线程(新可运行{
公开募捐{
打印列表(doSomething());
}
}
thread1.start();
thread2.start();
在这里的这段代码中
public ArrayList<T> doSomething(){
ArrayList<T> list = new ArrayList<>();
//...Add content to the list
return list;
}
您已经创建了两个
ArrayList
s,因此这两个线程之间不会有任何“共享”,因为它们是完全不同的对象。在这里的这段代码中
public ArrayList<T> doSomething(){
ArrayList<T> list = new ArrayList<>();
//...Add content to the list
return list;
}
您已经创建了两个
ArrayList
s,因此这两个线程之间不会有任何“共享”,因为它们完全是两个不同的对象。在您发布的代码中,创建了ArrayList
的两个不同实例。因此,实际上您正在处理两个独立的对象实例
但是,如果要在线程之间共享实例,则需要注意线程安全。在您发布的代码中,创建了两个不同的
ArrayList
实例。因此,实际上您正在处理两个独立的对象实例
但是,如果要在线程之间共享实例,则需要注意线程安全
在代码上创建对象的地方,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建
@Albus的回答是正确的。不过,要添加一些细节,所有对象都是在堆上创建的,但是,在您的情况下:
public ArrayList<T> doSomething() {
ArrayList<T> list = new ArrayList<>();
...
public ArrayList doSomething(){
ArrayList=新建ArrayList();
...
对对象list
的引用仅存储在堆栈上。ArrayList
对象本身在堆上,但由于list
在堆栈上,不同线程不可能访问此列表,这将导致并发问题。如果两个线程以某种方式访问相同的ArrayList
对象,或者因为它们共享的是一个静态
字段,或者是传入的,那么您需要担心同步和并发性
在代码上创建对象的地方,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建
@Albus的回答是正确的。不过,要添加一些细节,所有对象都是在堆上创建的,但是,在您的情况下:
public ArrayList<T> doSomething() {
ArrayList<T> list = new ArrayList<>();
...
public ArrayList doSomething(){
ArrayList=新建ArrayList();
...
对对象
list
的引用仅存储在堆栈上。ArrayList
对象本身在堆上,但由于list
在堆栈上,不同线程不可能访问此列表,这将导致并发问题。如果两个线程以某种方式访问相同的Ar光线列表
对象,或者因为它们共享的是一个静态
字段,或者是传入的,那么您需要担心同步和并发性。要了解局部全局变量和静态变量之间的差异[单击此处][1]:要了解局部全局变量和静态变量之间的差异[单击此处][1] [1]: