当前位置: 首页 > 面试题库 >

同步对不可变整数对象的访问

方梓
2023-03-14
问题内容

代码段-1

class RequestObject implements Runnable
{
    private static Integer nRequests = 0;

    @Override
    public void run()
    {       
        synchronized (nRequests)
        {
            nRequests++;
        }
    }
}

代码段-2

class RequestObject implements Runnable
{
    private static Integer nRequests = 0;
    private static Object lock = new Object();

    @Override
    public void run()
    {       
        synchronized (lock)
        {
            nRequests++;
        }
    }
}

尽管第二个代码段在不引起任何竞争条件的情况下运行良好,但第一个代码段未能成功同步同一类的不同实例(RequestObject)之间对静态数据成员的访问。有人可以对此进行更多说明。我想了解为什么第一种方法不起作用。


问题答案:

您将不断创建新的Integer对象,然后对其进行同步,这至少使考虑它变得非常混乱。这样就可以得到以下情况:

线程A保持当前值nRequests(假设为0)

线程B排队等待相同的值(0)

线程A增加nRequests(到值1)

线程C掌握了新值并对其进行同步,增加并释放了该值。

线程A在0处放开了监视器

线程B在0上同步并增加到1,从而覆盖C的更改

使用第二种方法,您只有一个对象,每个人都必须同步。正是您想要的。



 类似资料:
  • 问题内容: 我刚刚遇到了Java中的同步块,并编写了一个小程序来测试它的工作方式。 我创建10个线程,并让每个线程将一个Integer对象增加1000次。 因此,在使用同步的情况下,所有线程完成工作后,我将假定结果为10000,而在没有同步的情况下,结果将小于10000。 但是,同步并没有如我所料。 我猜想这与对象的不变性有关。 我的程序: 有人可以澄清吗? 问题答案: 每次您对 进行同步时,sy

  • 问题内容: 代码段-1 代码段-2 我在第一个代码段中遇到了竞争。我知道这是因为我正在获得对不可变对象(类型为Integer)的锁定。 我已经写了第二个代码片段,这再次使“布尔”不变。但这有效(输出运行中不显示竞争条件)。如果我正确理解了上一个问题的解决方案,则以下是出现问题的一种可能方法 线程1锁定由指向的对象(例如A) 线程2现在试图获取由指向的对象的锁,并进入A的等待队列。 线程1进入同步块

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 问题内容: 从已接受的答案回答这个问题:在Java关键部分中,应该同步什么? 我了解到 和: 做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作? 问题答案: 您似乎在混合事物。 首先 从同步角度看,它等效于: 优点/缺点已被提及,各种重复项提供了更多信息。 其次, 意味着同步块中的指令不能由2个线

  • 本文向大家介绍浅谈Python中的可变对象和不可变对象,包括了浅谈Python中的可变对象和不可变对象的使用技巧和注意事项,需要的朋友参考一下 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确

  • 问题内容: 假设我有这个课程: 一个线程可以在不访问该对象的情况下写入这些字段,而另一个线程可以读取它们吗? 注意:这些值可以彼此分开对待,因此在读取时更改没关系。 编辑 : 为了澄清起见,这些字段是 可变的 。只有它们引用的对象是 不可变的 。 问题答案: 从技术上讲,你需要让他们,或读取 和 使用写出来,以保证读者会读的最先进的最新值。正如您现在所拥有的,如果一个线程写入一个值,则不能保证另一