【发布时间】: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