java - Android并发: UI thread edit a variable and other thread read the same variable

标签 java android multithreading concurrency synchronization

我对 UI 线程和其他线程之间的相对并发有一个疑问。

Ui主线程更新不同变量的值: - 漂浮 - 长的 - boolean 值

我有另一个线程读取相同的变量并用它执行一些逻辑操作(不编辑其值),并发送带有此操作结果的本地广播消息。

是否存在并发问题,我必须使用:同步方法和原子变量,否则没关系?

我反射(reflection)了这个问题,因为 float Primitive 没有原子变量,而且我害怕用错误的代码阻塞 Ui 线程..

编辑:其他问题

Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).

来自:https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

那么 int,double 基本类型是原子类型,对吗?问题出在 long 和 double 上。

例如:

class test
{

    int c=0;
    long p=0;

    new Thread1( new Runnable(){

     public void run(){
       a=a+c;
       p=p+c;
     }
    }
    ).start();

   new Thread2( new Runnable(){

     public void run(){
       c=function();
       p=functionx();
     }
    }
    ).start();

    ....
}

我必须使用 volatile int 来解决线程之间的可见性问题,否则这并不重要?对于 long 变量,我应该使用atomicLong 因为对 long 原语的操作不是原子的吗?

p.s:我不太明白线程之间的变量可见性问题

最佳答案

看看我在 SO 上给出的另一个答案您可能需要的是使变量可变。 UI线程,不是UI线程,线程就是线程。在 UI 线程上修改变量的重要性在于,变量将被显示。您正在做的是将修改后的值发送到其他地方。

根据我对你的问题的理解:只要使变量可变,你应该没问题。

关于java - Android并发: UI thread edit a variable and other thread read the same variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29591683/

相关文章:

java - 无法在 Fragment Activity 上删除和创建数据

c# - MSR Orleans - 如何创建具有并行读取的读写器粒度

c++ - 为什么 UI 更改在 Qt 中不是即时的?

java - 将 FrameLayout 设置为在按钮单击时可见

java - 在 Android 应用程序中存储用户设置的最合适方法是什么

java - 读取 InputStream 到 Arraylist

android - Gradle:如何在控制台中显示 androidTest 结果?

java - 我可以结合按功能分组对流进行分区吗?

android - 带有 ImageView 和 Executor Framework 的滞后 Listview

c# - 如何在 ASMX Web 服务中一次限制一个调用者对特定类的访问?