当前位置: 首页 > 知识库问答 >
问题:

Android线程并发UI线程编辑一个变量,其他线程读取同一个变量

柴正祥
2023-03-14

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

Ui主线程更新不同变量的值:-flol-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();

新线程2(new Runnable(){

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

....

}

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

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

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

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

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

新线程2(new Runnable(){

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

....

}

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

附言:我不太理解线程之间的变量可见性问题

共有1个答案

姜胤
2023-03-14

作为经验法则。如果变量的新值依赖于它的旧值,即p=p 5,那么单独的易失性是不够的。您可能应该查看原子XXX类。

是的,您的代码中会有一个种族条件。

 类似资料:
  • 我有一个疑问是UI线程和其他线程之间相对并发。 Ui主线程更新不同变量的值:-float-long-boolean 我有另一个线程读取相同的变量并对其进行一些逻辑操作(不编辑其值),并将此操作的结果发送本地广播消息。 是否存在并发问题,我必须使用:同步方法和原子变量,还是无关紧要? 我反思这个问题,因为没有浮点基元的原子变量,也因为我害怕用错误的代码阻止Ui线程... 编辑:其他问题 对于引用变量

  • 在我的程序中,我需要多个线程使用和编辑同一个变量,但它似乎不起作用。这是我的意思的一个例子,这将是我的主要课程。 这将是我的Thread类: 我当场编写了这段代码,所以可能会有一些错误,但没关系。我的程序基本上需要这样做,但不是每次打印数字加1,而是所有线程只需多次打印相同的数字0。请帮帮我,谢谢。

  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 问题内容: 我正在用Go编写执行大量并行计算的软件。我想从工作线程中收集数据,但我不太确定如何以安全的方式进行数据收集。我知道我可以使用通道,但是在我的场景中,它们使它变得更加复杂,因为我必须以某种方式同步主线程中的消息(等到每个线程发送了一些东西)。 情境 主线程创建 n个 实例,并在goroutine中启动其方法,以便每个工作线程都在各自的线程中运行。主线程每10秒应从工作线程中收集一些简单值

  • 你好,我是多线程编程的新手。我正在尝试创建一个代码来创建一个线程THREAD1,在它完成某些事情后,它会触发另外两个线程,例如THREAD2和THREAD3,然后退出。 我写了两个可能的解决方案。 1) 使用条件变量(不起作用:在某些情况下会出现死锁): 2) THREAD1直接创建另外两个线程。 我想知道你的意见。非常感谢你