Java 序列化:在多线程环境中维护缓存是好还是坏?

Java 序列化:在多线程环境中维护缓存是好还是坏?,java,multithreading,serialization,Java,Multithreading,Serialization,哪种方法更好: 使用序列化创建缓存,或 简单地使用分隔符将字符串数组形式的对象写入文件 最近有人告诉我,序列化会创建一个不同的线程来处理,不应该在具有时间限制的多线程环境/应用程序中使用,因为在这种环境中,您需要更快的处理速度和更少的中断 那么,序列化在大型多线程java项目中效率低下是真的吗 序列化不会发生在不同的线程上。当java序列化对象时,如果另一个线程试图修改同一个对象,您可能会遇到一致性问题,因为在序列化过程中对象的状态正在更改。 您可能会在自己的实现中遇到同样的问题。为了回答“

哪种方法更好:

  • 使用序列化创建缓存,或
  • 简单地使用分隔符将字符串数组形式的对象写入文件
最近有人告诉我,序列化会创建一个不同的线程来处理,不应该在具有时间限制的多线程环境/应用程序中使用,因为在这种环境中,您需要更快的处理速度和更少的中断


那么,序列化在大型多线程java项目中效率低下是真的吗

序列化不会发生在不同的线程上。当java序列化对象时,如果另一个线程试图修改同一个对象,您可能会遇到一致性问题,因为在序列化过程中对象的状态正在更改。
您可能会在自己的实现中遇到同样的问题。为了回答“构建缓存的序列化是否有效”的问题,我建议您查看缓存实现(一些好的开源软件,如hazlecast或ehcache)

长话短说,多线程Java项目中的序列化效率不高是不正确的

说到标准Java序列化,它发生在调用序列化的同一线程中,并且可以在覆盖线程环境中使用。序列化可由多个线程写入的对象时,需要使用锁。在确保内部数据结构是线程安全的方面,缓存(如我是提交者)发挥了作用

同时,序列化未考虑缓存的任意Java对象可能会非常耗时。设计缓存的一种简单方法是,如果可能的话,确保键和值只有简单的字段,如int和string,并且理想情况下是不可变的。通过这种方式,可以暗示缓存(在Cacheonix中,它实现了不可变接口)可以通过引用传递对象,从而允许缓存通过引用传递对象来避免序列化


希望这有帮助

序列化没有问题。可以在多线程环境中使用,无需担心“只需使用分隔符将字符串数组形式的对象值写入文件”——您刚刚描述了一种非常简单的序列化形式。Java序列化不是在不同的线程上完成的。您是否应该使用它取决于许多您没有给出的因素,对于StackOverflow的问题来说,这些因素可能太长,太固执己见。任何磁盘I/O都会阻塞执行它的线程。如果性能是最重要的,那么可以考虑使用异步(启动并忘记)解决方案或内存缓存。另外,不要过早地进行优化,有时它被称为“万恶之源”,你被告知创建另一个线程的序列化是完全错误的。