Java线程访问对象的字段

时间:2017-10-17 05:19:49

标签: java multithreading synchronization volatile

我在面试中得到一个问题如下: -

在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”字段?

2 个答案:

答案 0 :(得分:1)

t1可以查看已刷新到主内存的count的最新值,在进入synchronized块时读取它,然后将其写回树叶;它在末尾打印的值总是比它读取的值多1000倍。

t2会在某个时间读取count的值;允许保留缓存值。对count值的任何更新都可以立即,稍后或从不刷新到主存储器。

答案 1 :(得分:-2)

会有竞争条件。由于,方法“ m ”是线程安全的。您可以在此处找到有关race condition

的详细信息