单核cpu上的volatile和synchronized(例如 - pentium pro)

时间:2014-05-06 06:29:10

标签: java multithreading assembly cpu volatile

我已经阅读并详细了解了基于SMP架构的CPU中cpu级别的Java volatile和synchronized关键字的含义。

关于这个问题的一篇很棒的论文在这里:

http://irl.cs.ucla.edu/~yingdi/web/paperreading/whymb.2010.06.07c.pdf

现在,请将SMP cpus留给这个问题。我的问题是:volatile和synchronized关键字如何与旧的单核CPU相关联。例如Pentium I / Pro / II / III /早期IV。

我想具体了解:

1)L1-L2缓存是否不用于读取内存地址,所有读写都直接执行到主内存?如果是,为什么? (由于只有一个缓存副本,并且不需要一致性协议,为什么缓存不能由两个线程直接使用,这些线程是时间切片单核CPU?)。这是我在阅读了几十个互联网论坛后提出这个问题,这个论坛关于如何在“主内存中的主副本”中读取和写入易失性。

2)除了对这个或更具Java平台特性的指定对象进行锁定之外,synchronized关键字对单核CPU(编译器,汇编,执行,缓存)还有哪些其他影响?

3)使用非超标量CPU(Pentium I)时,不会重新排序指令。那么如果是这种情况,那么在Pentium 1上运行时是否需要volatile关键字? (原子性,可见性和排序是一个“没问题”的权利,因为只有一个缓存,一个核心可以在缓存上工作,而且没有重新排序)。

1 个答案:

答案 0 :(得分:1)

  

1)L1-L2缓存是否不用于读取内存地址,所有读写都直接执行到主内存?

没有。缓存仍然启用。这与SMP无关。

  

2)除了对这个或更具Java平台特性的指定对象进行锁定之外,synchronized关键字对单核CPU(编译器,汇编,执行,缓存)还有哪些其他影响?

     

3)对于超标量/非超标量体系结构(无序)处理器,这两个关键字是否有任何变化?

天哪,您是否必须提出有关 Java 的问题?请记住,所有的东西最终归结为良好的机器说明。我并不是非常熟悉Java同步的内容,但据我所知,synchronized只是典型的监视器式同步机制的语法糖。同时在临界区中不允许多个线程。不是简单地在自旋锁上旋转,而是利用调度程序 - 等待的线程进入休眠状态,并且可以在再次进行锁定时再次唤醒。

要记住的是,即使在单核,非SMP系统上,您仍然仍然需要担心操作系统抢占线程!每当操作系统想要时,可以在CPU上调度这些线程。当然,这就是锁的目的。

同样,这个问题在汇编的上下文中是更好的问题,甚至是C(其编译结果通常可以直接推断)而不是Java,后者必须处理VM,JITted代码等。