2012-07-30 53 views
0

我有2個主題。Java [android]:我應該使用同步ou semphore對象嗎?

第一個調用這個函數

public int doCompute1(obj) 
{ 
    if (obj.state == OK_FOR_COMPUTE1) 
    { 
     // do something 
     obj.state = OK_FOR_COMPUTE2; 
    } 
} 

第二個線程調用這個函數

public int doCompute2(obj) 
{ 
    if (obj.state == OK_FOR_COMPUTE2) 
    { 
     // do something 
     obj.state = OK_FOR_COMPUTE1; 
    } 
} 

對於它似乎很好地工作的那一刻!

我的問題是:它是正確的嗎? 是否有可能在多核處理器上,obj.state在高速緩存中,然後通過線程修改這個vaue,第二個線程不會看到它?

如果此代碼不正確,該怎麼辦?

+0

我猜你的意思==在if語句中。 – johusman 2012-07-30 08:53:01

+0

是的。抱歉。我已經修正了 – webshaker 2012-07-30 08:58:04

+0

好。但如果最終答案在評論中!我應該接受答案嗎?我應該怎麼做在這種情況下!最後可能會有問題hav有迴應! – webshaker 2012-08-01 07:08:10

回答

2
synchronized(obj){ 
    if (...){ 
    } 
} 

會做的東西

編輯:

什麼同步呢?

synchronized(obj){ //if obj is not locked,i lock it and go to the if instruction.if obj is locked, i'm waiting for its unlocking 

      //some stuff that will run with no thread-interruption caused by other synchronized block locked on the obj object 

    }//the obj object is unlocked and let other methods enter their synchronized(obj) block 
+0

嗡嗡聲。好的,謝謝,但是當我這樣做時真的發生了什麼!我應該同步所有的對象還是隻同步obj.state? – webshaker 2012-07-30 09:00:26

+0

您必須同步所有想要同步運行的方法共享的對象。 看到我編輯的答案,我解釋瞭如何同步工作 – VinceFR 2012-07-30 09:09:54

+0

哼好吧,我明白了。這不是我在代碼中使用的obj,這是另一個對象!但使用同步不會解決我的問題!我的兩個線程無法訪問相同的功能!線程#1調用doCompute1,線程#2調用doCompute2。 synchonized將不會有用!我的問題是處理器緩存問題! – webshaker 2012-07-30 09:14:20