2017-10-17 103 views
-1

我得到了一個採訪,詢問如下問題的領域: -Java線程訪問對象

在Java中,有一個場中的物體,如下面給出的...

public class MyObject 
{ 
    int count=0; 

    public synchronized void m() 
    { 
     for(int j=0; j< 1000; j++) 
     { 
      System.out.println(Thread.currentThread().getName()+"-> "+j); 
      count++; 
     } 

     System.out.println(Thread.currentThread().getName()+" completed ->"+count); 
    } 
} 

這裏,在同步方法中訪問字段「count」,並且該字段未聲明爲易失性。

會有什麼實際的行爲,如果一個線程T1訪問方法米()其被同步,並且使用字段「計數」在其內,同時另一個線程T2嘗試訪問該字段「計數「直接?

+0

對於線程t2,當你說access時,你的意思是隻讀嗎? – Knox

+0

是的,只讀。它會讀取更新後的值還是會出現競態狀況? –

回答

-2

會有競賽條件。由於只有方法「m」是線程安全的。在這裏,你可以找到有關race condition

1

t1將刷新到主內存的count最先進的日期值的知名度,閱讀它,當它進入​​塊,和寫回離開時的細節;它在最後打印的值總是比它讀取的值多1000。

t2將在某個時間讀取count的值;允許保留一個緩存值。計數值的任何更新都可能立即刷新到主內存中,稍後或永遠不會。