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

Java。多线程环境中对象的序列化

红弘盛
2023-03-14
问题内容

我有一个对象,其内部可变状态正在由一个或多个线程不断更新。对象已同步,目标是从另一个线程定期保存其状态(通过序列化):

public class Counter implements Serializable {
    private int dogCount;
    private int catCount;

    public synchronized void updateFromDogThread( int count ) { 
        dogCount = count; 
    }

    public synchronized void updateFromCatThread( int count ) { 
        catCount = count; 
    }
}

问题:

  • 在这种情况下,序列化安全吗?
  • 它是如何工作的?也就是说,ObjectOutputStream执行序列化是否会阻塞直到不再有线程运行Counter
  • 如果Counter同步不使用固有锁,而是使用其他锁怎么办?

问题答案:
  • 在这种情况下,序列化安全吗?

否。正如@Tom Hawtin所说,您将需要执行自己的锁定,以确保在序列化对象时不会更改对象。

  • 它是如何工作的?也就是说,ObjectOutputStream是否将执行序列化块,直到不再有任何线程在Counter上运行了?

ObjectOutputStream不会在引擎盖下锁定。如有必要,由应用程序决定。

  • 如果Counter的同步不使用固有锁,而是使用其他锁怎么办?

然后,在序列化发生时,您的应用程序还需要使用其他锁定来锁定更新。

如果您要序列化的状态仅由一个对象的状态和两个字段组成,则锁争用和粒度应该不成问题。但是,如果对象很复杂,那么锁争用就很成问题了,获取锁而又没有死锁风险的问题也很成问题。这种情况需要仔细设计。



 类似资料:
  • 如果我有多个线程,每个线程使用injector获取EntityManager对象,每个线程使用em对象选择其他类对象的列表。准备好在for循环中使用。 如果一个线程首先完成并调用clear(),这会影响其他线程吗?比如for循环会有异常? 谢谢你。

  • 公共类栏实现可运行{ } 结果:当中的任何线程通过同步块获取锁(例如获取)时,和将处于阻塞状态,但同时允许其他线程、和并发执行。 公共类栏实现可运行{ 结果:只有类的任何实例的一个线程将获得锁(例如获得锁),所有其他线程()将被阻塞,直到释放锁。 公共类栏实现可运行{ synchronized块()中的静态引用是否等同于?

  • 我的 Web 应用程序中出现随机错误,我迷路了。我创建了一个库来解码代码。我尝试了很多,从未失败过测试。但突然间,它开始随机失败。由于它在单线程测试中运行良好,有时在 servlet 环境中失败时,我能想象的唯一解释是问题与多线程环境中使用的库有关。老实说,我知道多线程是一个非常复杂的问题。我担心我的库可能不是线程安全的。顺便说一下,它非常简单,它是一个具有几种静态方法的正面类。基本上,假设您正在

  • 我在学习多线程时发现对象的速度变慢了。hashCode在多线程环境中,因为对于相同数量的对象,计算运行4个线程的默认哈希代码要比运行1个线程的默认哈希代码花费两倍的时间。 但根据我的理解,并行完成这项工作也需要类似的时间。 您可以更改线程数。每个线程都有相同的工作量,因此您希望在我的四核机器上运行4个线程可能需要与运行单个线程相同的时间。 我看到4x大约2.3秒,但是。1x为9秒。 我的理解是否有

  • 问题内容: 有一个简单的愚蠢问题困扰着我,并在我脑海中提出了几个论点。我想排除所有对以下问题的怀疑。 假设有五个线程同时执行一个调用。 线程1调用。 当线程1位于第1节中时,线程2调用。 那么线程1将会发生什么?会进入睡眠状态吗? 当线程1获得机会时,它将从暂停的第1节继续执行吗? 在所有五个线程之间共享一个相同的线程时,该如何处理? 是否有可能互换多个线程发送的消息? 问题答案: 汉斯·帕桑(H

  • 现在,他提出的下一个问题是为多线程环境编写单例类。然后,我写了双重检查单例类。 然后,他反对使用和双重检查,并说这是没用的。为什么要检查两次,为什么要使用synchronized?我试着用多种方案说服他。但是,他没有。 后来,我在家里尝试了下面的代码,在那里我使用了带有多个线程的简单的单例类。 那么,问题是,在多线程环境中是否有必要使用或/和双重检查方法?似乎我的第一个代码本身(没有添加任何额外的