Multithreading RxJava和多线程变量

Multithreading RxJava和多线程变量,multithreading,scope,rx-java,rx-java2,race-condition,Multithreading,Scope,Rx Java,Rx Java2,Race Condition,下面的代码仅用于演示目的。这不是开发代码,所以请不要批评“坏习惯”。它只是用来传达概念的 假设您在一个方法中,有一个空列表 public void myMethod() { List<Strings> myList = new ArrayList<>(); } 但是,如果我们也这样做,但是从主线程访问它,它就会工作 Thread.wait(5000); RunOnMainThread { //--> This can be done any number

下面的代码仅用于演示目的。这不是开发代码,所以请不要批评“坏习惯”。它只是用来传达概念的

假设您在一个方法中,有一个空列表

public void myMethod() {
  List<Strings> myList = new ArrayList<>(); 
} 
但是,如果我们也这样做,但是从主线程访问它,它就会工作

Thread.wait(5000);

RunOnMainThread { //--> This can be done any number of ways.
  Assert.true(myList.size() > 0) --> True
}

整个工作代码如下所示

public void myMethod() {
  List<Strings> myList = new ArrayList<>();

  getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
   })

  Thread.wait(5000);

  RunOnMainThread { //--> This can be done any number of ways.
     Assert.true(myList.size() > 0) --> True
  }
} 
public void myMethod(){
List myList=new ArrayList();
getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(新回调(){
@凌驾
公用电话(列表){
myList.addAll(列表);
}
})
线程。等待(5000);
runnonmainthread{/-->这可以通过多种方式完成。
Assert.true(myList.size()>0)-->true
}
} 

我在其他案例中也看到过类似的情况,但我不知道为什么。这是因为每个线程都有自己的堆栈/内存区域吗?

我很惊讶,你没有收到编译器警告说myList超出了范围。它应该声明为静态或移动到类范围。由于对sub的调用是异步的,因此响应将到达myMethod范围之外的另一个线程

有趣!所以,如果这是一个类变量,那么使用“volatile”能解决这个问题吗?这就引出了我这边的一个问题。这不全是运气吗?主线程是一个循环线程,这意味着它可能不会立即执行,对吗?一旦工作运行,列表就初始化了,这不是巧合吗?感谢这是因为您更新了主线程上的
myList
,然后在延迟一段时间后安排主线程上的大小检查。如果您遵循这些步骤,这很容易重复。“仅用于演示目的”这样人们就不会抱怨不好的做法,以为我在使用计时器来处理异步行为。等等,这里有一个
List myList=null
,但没有
List=new ArrayList()
或等效项。。。我知道这只是一个演示,但是。。
Thread.wait(5000);

RunOnMainThread { //--> This can be done any number of ways.
  Assert.true(myList.size() > 0) --> True
}

public void myMethod() {
  List<Strings> myList = new ArrayList<>();

  getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
   })

  Thread.wait(5000);

  RunOnMainThread { //--> This can be done any number of ways.
     Assert.true(myList.size() > 0) --> True
  }
}