如何解决从不同的调度程序设置和读取rxJava链中的实例变量值
我不确定使用不同的调度程序从rxJava链读取/写入实例变量的安全性。有一个小例子
public class RxJavaThreadSafety {
private int variable = 0;
// First call
public void doWriting() {
Single.just(255)
.doOnSuccess(
newValue -> variable = newValue
)
.subscribeOn(Schedulers.io())
.subscribe();
}
// Second call
public void doReadingRxChain() {
Single.fromCallable((Callable<Integer>) () -> variable)
.subscribeOn(Schedulers.computation())
.subscribe(
result -> System.out.println(result)
);
}
// Third call
public void doReading() {
System.out.println(variable);
}
}
为简单起见,假设这三个方法一个接一个地调用
我的问题:在io调度程序中设置变量“并在最近从计算调度程序或主线程中读取此变量”是否安全?
我认为这不是线程安全的,但是我希望一些rxJava和并发专家对此进行证明
解决方法
不,这不是线程安全的。
当您使用subscribeOn
时,这意味着调用subscribe()
会将用于生成项目的任务添加到调度程序的工作队列中。
doWriting()
和doReadingRxChain()
方法将任务添加到不同的调度程序。无法保证doWriting()
中的链甚至会在doReadingRxChain()
之前开始运行。例如,如果所有IO线程都忙,则会发生这种情况。
还有一个更基本的问题:您正在一个线程中写入variable
的值,而在另一个线程中读取它。如果没有任何并发控制,则无法保证读取variable
的新值会被线程读取。解决该问题的一种方法是将变量声明为volatile
:
private volatile int variable = 0;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。