【问题标题】:Android Thread Concourrency UI thread edits a variable and other threads read the same variableAndroid Thread Concourrency UI 线程编辑一个变量,其他线程读取同一个变量
【发布时间】:2015-06-28 04:27:18
【问题描述】:

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

ui主线程更新不同变量的值:-float-long-boolean

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

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

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

那么 int,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();

....

}

我怀疑 UI 线程和其他线程之间的相对并发。

ui主线程更新不同变量的值:-float-long-boolean

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

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

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

编辑:其他问题

对于引用变量和大多数原始变量(除了 long 和 double 之外的所有类型),读取和写入都是原子的。

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

那么 int,double 基本类型是原子的吧?问题在于长期和双重。

例如: 班级考试 {

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 : 我不太了解线程之间的变量可见性问题

【问题讨论】:

  • “因为浮点原语没有原子变量” - 好吧,这不是一个真正的论点。有一个 AtomicReference 类可以原子地获取/设置几乎任何类型的对象。

标签: java android multithreading synchronization


【解决方案1】:

作为一个经验法则。如果一个变量的新值依赖于它的旧值,即p=p+5,那么仅仅 volatile 是不够的。你应该看看AtomicXXXclasses。

是的,您的代码中将有一个 race-conditon

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多