在我的 Cocoa/iOS 应用程序中,我有一个静态double
变量(我们称之为foo
),它必须是:
- 由我的应用程序的一部分在后台线程上更新
- 由我的应用程序的另一部分在主线程上读取
我正在寻找最轻量级的方式来同步对foo
.
注意:我知道在这些情况下最简单的解决方案通常是调整代码,以便只有一个线程访问变量,因此不需要同步。假设我已经确定foo
在这种情况下限制对单个线程的访问是不可能的(可能在步骤1中采取的操作发生得太快/经常发生,以至于线程切换是不可取的)。请不要回答“限制foo
访问一个线程”的答案。我正在寻找替代方案。
我目前的理解是,使用volatile
变量是同步访问foo
. 所以foo
声明如下:
static volatile double foo = 60.0;
后台线程编写代码是这样的:
foo = 90.0;
主线程读取代码是这样的:
double bar = 0.0;
bar = foo;
// use bar here …
一些问题:
- 是否保证主线程
foo
在将其写入后台线程之后看到更新的值(假设foo
已声明volatile
)?IOW,我是否已经做了足够的工作来确保两个线程将看到彼此的读/写操作的结果? - 我假设在这种情况下使用
volatile
fordouble
值更快/更轻量/更可取,而不是像@synchronized
块或NSLock
. 真的吗?IOW,是volatile
这种特殊情况的最佳解决方案吗?