Android Thread Concourrency UI线程编辑变量,其他线程读取相同的变量

时间:2015-04-21 06:52:42

标签: java android multithreading synchronization

我对UI线程和其他线程之间的一致性存在疑问。

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

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

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

我反思这个问题,因为浮点原语没有原子变量,因为我害怕用错误的代码阻止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

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

是否存在并发问题,我必须使用:synchronized方法和原子变量,或者它无关紧要?

我反思这个问题,因为浮点原语没有原子变量,因为我害怕用错误的代码阻止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:我真的不了解线程之间的变量可见性问题

1 个答案:

答案 0 :(得分:0)

作为一个拇指规则。如果变量的新值取决于其旧值,即p=p+5则仅 volatile 是不够的。您应该查看AtomicXXX类。

是的,您的代码中将包含 race-conditon