对于线程与锁的一个问题,希望大虾们不吝赐教。 Class Sample { 
int a=1,b=2; 
void hither(){ 
   a = b; 
} void yon() { 
  b = a; 

} 有2个线程分别调用hither() 和yon(),则对主存的操作可能性是以下三种 (h,y,m 分别代表了线程的存储和主存): 
1) write a-> read a. read b -> write b (ha=2,hb=2,ma=2,mb=2,ya=2,yb=2) 
2) read a-> write a. write b->read b (ha=1,hb=1ma=1,mb=1,ya=1,yb=1) 
3) read a-> write a. read b->write b. (ha=2,hb=2,ma=2,mb=1,ya=1,yb=1) 我觉得好像步骤少了一些 。(h,y 代表相关线程的store,load相对的主存操作) 
1) read hb -> write ha ->read ya ->write yb 
但是 第2)3)种情况我就不明白了,希望能够指出,谢谢

解决方案 »

  1.   

    第一种:
    执行完 hither 再执行 yon;
    第二种:
    执行完 yon 再执行 hither;第三种:(也就是问题所在)
    a = b 分成两个步骤(可中断),读入(至 CPU) b,然后写出(至内存)a,b = a 同理。
    因为是两个线程同时执行,可能是这样的顺序:
    hither 的读入 b,这时候 b 为 2;
    yon 的读入 a,这时候 a 为 1;
    hither 的写出 a,2;
    yon 的 写出 b,1;
    实现了一个 swap :-)
      

  2.   

    多谢回复,但是可能我没太说清楚。我想知道的是,根据java虚拟机规范的那些约束,从而写出一步步的具体内存操作,这里主要是主存的操作。省略了线程内存储的操作(store,load)。我不明白的就是为什么会得出2)3)那种主存操作顺序。我希望得到的是为什么会得出2)3)那样的主存操作顺序。根据什么约束来的。