Java 作为局部变量创建对象

Java 作为局部变量创建对象,java,multithreading,concurrency,Java,Multithreading,Concurrency,我一直在阅读,我发现无论在代码上创建对象的位置,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建的。我想知道在本例中,执行doSomething()时创建的ArrayList是否会在产生并发问题的线程之间共享,或者在堆中创建两个不同的实例 public ArrayList<T> doSomething(){ ArrayList<T> list = new ArrayList<>(); //...Add content to

我一直在阅读,我发现无论在代码上创建对象的位置,例如作为成员变量、局部变量或类变量,它们总是在Java的堆空间中创建的。我想知道在本例中,执行
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]: