标题几乎是自我解释的。
我是否需要在Java中同步两个线程(1正在读取而另一个正在写入)?
我会添加更多详情:
让我们考虑我们有3个类,1个包含共享内存,1个用于写入线程,它将从共享内存对象增加一个变量,1个用于读取线程,它将打印该值共享对象中的变量。
答案 0 :(得分:0)
否,就在你的情况下。如果更改的线程开始递增,然后读取线程进行检查,则它可以接收旧值。
如果增量只是那个,那不是问题,而不是耗时的操作。
最重要的:分配给内存的原子性:
我记得的JLS:在读取时,对于int
,字节也不会被破坏:旧字节和新字节的混合,例如从255到256得到0x00_00或0x01_FF 。 (除非在嵌入式处理器上,java me)。
这不适用于long
或double
。
但是对于那些类型,可以使用:
volatile long counter;
volatile double impreciseCounter;
通过在线程之间采取预防措施来保证原子性。执行。
纯粹对于编码风格,原则上,我仍然会使用AtomicInteger
或至少volatile
,因为这样的技术实现要求似乎过于依赖于编译器和处理器。预计会有一个垄断的利益相关者。