2015-04-12 100 views
0

我有一个怀疑UI线程和其他线程之间相对并发。Android并发:UI线程编辑一个变量和其他线程读取相同的变量

UI主线程更新不同的变量的值: - 浮动 - 长 - 布尔

我有另一个线程读取相同的变量和做一些逻辑运算(不编辑其值)与并发送本地广播消息和该操作的结果。

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

我思考这个问题,因为没有浮法原始原子变量,因为我害怕了阻止错误的代码UI线程..

编辑:其他问题

读取和写入对于参考变量和大多数原始变量(除长和双以外的所有类型)是原子的。

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

然后INT,双原始类型是原子正确?问题是漫长而双倍的。

例如:

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(); 

    .... 
} 

我必须使用挥发性INT线程或者doensn't物质之间的可见性问题?而对于long变量,我应该使用atomicLong,因为对长基元的操作不是原子的?

P.S:我真的不明白线程

回答

1

之间的变量可视性问题看看另一个答案我介绍了SO什么你可能需要是使变量波动。 UI线程,而不是UI线程,线程是线程。在UI线程上修改变量的重要性是这样变量将被显示。你正在做的是将修改后的值发送到别的地方。

从我的理解你的问题:只要使变量易变,你应该没问题。

+0

首先感谢答案:)我已经在这里看到了其他答案在stackoverflow和我已经搜索指南和文件的易变变量,但我还没有读.. 如果我编辑一个变量,并在此期间其他线程读取相同的变量,它会是什么问题?崩溃是因为变量处于不一致的状态,或唯一的问题是第二个线程读取旧变量的状态? 现在我要读你在其他帖子中回答:D – aeroxr1

+0

嗨! 我已阅读你的答案在其他问题。我有一个问题:为什么只有当一个线程编辑易失性变量和其他线程读取相同的易失性变量时,volatile变量才能正常工作? – aeroxr1

+1

volatile不保护变量,它只会让机器使缓存无效并转到主内存(简短版本)以获取更多详细信息,请参阅Cache coherence http://en.wikipedia.org/wiki/Cache_coherence – edharned