我在面试中得到一个问题如下: -
在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 ”,并且该字段未声明为volatile。
如果线程 t1 访问同步并在其中使用字段“count”的方法 m(),并且同时另一个线程<,则实际行为是什么? em> t2 试图直接访问“count”字段?
答案 0 :(得分:1)
t1
可以查看已刷新到主内存的count
的最新值,在进入synchronized
块时读取它,然后将其写回树叶;它在末尾打印的值总是比它读取的值多1000倍。
t2
会在某个时间读取count
的值;允许保留缓存值。对count值的任何更新都可以立即,稍后或从不刷新到主存储器。
答案 1 :(得分:-2)
会有竞争条件。由于仅,方法“ m ”是线程安全的。您可以在此处找到有关race condition
的详细信息