【发布时间】:2019-06-24 23:43:02
【问题描述】:
在多线程环境下,是不是每次对RAM的操作都必须是synchronized?
假设我有一个变量,它是指向另一个内存地址的指针:
foo 12345678
现在,如果一个线程将该变量设置为另一个内存地址(比如说89ABCDEF),同时第一个线程读取该变量,难道不是第一个线程从变量中读取完全垃圾,如果访问不会?不是synchronized(在某些系统级别上)?
foo 12345678 (before)
89ABCDEF (new data)
••••• (writing thread progress)
89ABC678 (memory content)
由于我从未见过这些事情发生,我假设在编写变量时存在一些系统级同步。我认为,这就是为什么它被称为“原子”操作。正如我发现的here,这个问题实际上是一个话题,并不是我完全虚构的。
另一方面,我到处读到同步对性能有重大影响。 (除了必须等待的线程。它们不能进入锁;我的意思是锁定和解锁的动作。)喜欢here:
synchronized给方法 […] 增加了大量开销。这些操作非常昂贵 […] 它对程序性能有极大的影响。 […] 昂贵的同步操作导致代码非常慢。
这如何结合在一起?为什么更改变量的锁定速度不明显,而其他任何东西的锁定都如此昂贵?或者,它是否同样昂贵,并且在使用时应该有一个很大的警告标志——比如说——long 和 double,因为它们总是隐含地需要同步?
【问题讨论】:
标签: multithreading memory-management