2017-10-17 106 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的值;允许保留一个缓存值。计数值的任何更新都可能立即刷新到主内存中,稍后或永远不会。