【发布时间】:2012-05-02 22:02:56
【问题描述】:
我正在开发一个使用两个线程的 Android 应用程序,第一个(写入器)线程正在更新两个变量,第二个(读取器)线程在计算中使用这两个变量。
如何确保第二个线程接收到正确的值?
这是我的第一个 java 锁定问题。我一直在阅读有关同步、易失性、trylock 的信息,但仍不清楚。对于一个变量,这很“容易”,但不明白如何对两个变量执行此操作。
详情:
这些变量在一个共享的公共类 AppState extends Application 中:
public long appstate.writerVar1;
public int appstate.writerVar2;
在主活动中创建线程并将应用状态传递给线程:
writerThread.appstate = appstate;
...
readerThread.appstate = appstate;
然后可以通过 writerThread 和 readerThread 访问变量,如下所示:
writerThread,示例:
appstate.writerVar1 = 1234;
appstate.writerVar2 = 5678;
readerThread,例如:
if( (appstate.writerVar1 == 9) && (appstate.writerVar2 == 6) ){
它应该像这样工作:
作家线程:
- 锁定两个变量
- 使用新值更新两者
- 解锁
读者话题:
- 锁定两个变量
- 读取值
- 解锁
有人可以向我展示执行此操作的 java 代码吗?谢谢!
--- 添加于 2012 年 4 月 23 日 ---
谢谢。抱歉延迟回答,但请阅读有关此内容的更多信息,包括有关可变对象的信息,http://www.javaranch.com/journal/2003/04/immutable.htm。
我试图了解如何从在主活动中创建的 writerThread 和 readerThread 调用它,并想出了以下代码:
writerThread:
私人 WriterState wSW;
...
var1W = 123;
var2W = 456;
wSW = new WriterState(var1W, var2W);
appstate.setWriterState(wsW);
readerThread:
私人 WriterState wsR;
...
wsR = appstate.getWriterState();
var1R = wsR.getVar1();
var2R = wsR.getVar2();
我尝试了这段代码,它似乎运行正常。我可以在读取 var1R 和 var2R 之间添加一个新的 var1W 和 var2W。
现在我的下一个问题:
a) 这个代码可以吗?
b) 假设 setWriterState 代码在一个循环中,这不会吃掉所有的内存吗?
c) WriterState 类怎么可能是可变的,我相信这里不可能是这样(你说:如果 WriterState 类是可变的)
我还在这里看到了一个例子 http://tutorials.jenkov.com/java-concurrency/synchronized.html 。
他们将 Counter 对象传递给两个线程。在这种情况下,这样的事情是不可能的吗?
【问题讨论】:
标签: java android multithreading locking