【问题标题】:Do i need to synchronize two threads (1 reading, 1 writing) in Java [closed]我是否需要在 Java 中同步两个线程(1 个读取,1 个写入)[关闭]
【发布时间】:2014-12-26 23:35:12
【问题描述】:

标题几乎是不言自明的。

我是否需要在 Java 中同步两个线程(一个正在读取,另一个正在写入)?

我会添加更多细节:

假设我们有 3 个类,1 个包含共享内存,1 个用于将从共享内存对象中递增变量的写入线程,1 个用于将打印变量值的读取线程共享对象。

【问题讨论】:

  • 这里不多说了。
  • 不,这不是不言自明的。这些线程在读写什么?读写机制本身是线程安全的吗?
  • 不是,如果读线程没有读到写线程写的东西。

标签: java multithreading synchronization


【解决方案1】:

,仅针对您的情况。如果更改线程开始递增,然后读取线程进行检查,它可以接收旧值。

如果增量只是这样,那不是问题,而不是耗时的操作。

最重要的:分配给内存的原子性: 我记得的 JLS: 在读取时,int 的字节也不会损坏:新旧字节的混合,比如从 2​​55 到 256 得到 0x00_00 或 0x01_FF。 (除非在嵌入式处理器上,java me)。 这不适用于longdouble。 但是,对于那些类型可以使用:

volatile long counter;
volatile double impreciseCounter;

通过在线程执行之间采取预防措施来保证原子性。

纯粹出于编码风格,原则上,我仍然会使用AtomicInteger 或至少volatile,因为这样的技术实现要求似乎过于依赖编译器和处理器。预期为垄断利益相关者。

【讨论】:

  • 非常感谢。我并不真正关心获得“旧值”,它将在下一次迭代中获得新值。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多