当前位置: 首页 > 知识库问答 >
问题:

从不同的调度程序中设置和读取rxJava链中的实例变量值

太叔永新
2023-03-14

我不确定使用不同的调度程序从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和并发专家来证明这一点

共有1个答案

洪增
2023-03-14

不,这不是线程安全的。

当您使用subscribeon时,这意味着调用subscribe()将生成项的任务添加到调度程序的工作队列中。

dowriting()doreadingrxchain()方法将任务添加到不同的计划程序。不能保证dowriting()中的链甚至会在doreadingrxchain()之前开始运行。例如,如果所有IO线程都忙,就会发生这种情况。

还有一个更根本的问题:您正在一个线程中写入变量的值,并在另一个线程中读取它。如果没有任何并发控制,就无法保证variable的新值被读取它的线程看到。解决此问题的一种方法是将变量声明为volatile:

private volatile int variable = 0;
 类似资料:
  • 我正在使用ReactiveLocation库。基本上,我想在4秒内获得一个足够准确的位置。如果在此期间未收到足够精度的位置,但其他位置已返回最高精度的位置。 一旦接收到足够准确的位置,则返回该位置并完成可观测。 我会发布我正在尝试的代码。我可能,也可能,以错误的方式进行。

  • 在RxJava中,有5种不同的调度程序可供选择: > immediate():创建并返回在当前线程上立即执行工作的调度程序。 trampoline():创建并返回一个调度程序,该调度程序将当前线程上的工作排队,以便在当前工作完成后执行。 newThread():创建并返回一个调度程序,该调度程序为每个工作单元创建一个新线程。 计算():创建并返回一个用于计算工作的调度程序。这可以用于事件循环、处理

  • 我正在使用spring-boot-starter-quartz2.2.1.release来调度Quartz作业,并且我已经在两个节点上部署了我的代码。而quartz.properties是这样的: 如果我发出了查询所有作业的请求,那么该请求可能会被发送到node1,并且只显示node1的作业。但我想同时显示node1和Node2的作业。 如果我发出了更新scanJobbyMachine1的请求,并

  • 我有一个Jenkins的工作,在那里我执行了一个Groovy脚本。从那个Groovy脚本中,我向另一个应用程序发出POST请求。我的Jenkins服务器和应用程序在不同的机器上。我需要从应用程序的代码中访问Jenkins环境变量。这可能吗? 我尝试使用System.getenv("ENVIRONMUT-VARIABLE-NAME")方法检索环境变量,但返回的结果为null。

  • (gdb) u 309 Warning: couldn't activate thread debugging using libthread_db: Cannot find new threads: generic error Warning: couldn't activate thread debugging using libthread_db: Cannot find new threa

  • 本文向大家介绍python 不同方式读取文件速度不同的实例,包括了python 不同方式读取文件速度不同的实例的使用技巧和注意事项,需要的朋友参考一下 1、按行读取较慢较耗时: 2、快速读取所有行: 以上这篇python 不同方式读取文件速度不同的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。