本帖最后由 iamczr 于 2010-11-04 16:33:21 编辑

解决方案 »

  1.   

    第一个问题,主内存包括了堆内存和方法区,还应该包括其他所有变量啊。
    第二个问题,我举例说明:主内存存在变量A=0;
                         线程1:需要用到A,于是把主内存中的变量A复制过来为A',假设操作之后A'=1;
                         线程2:也需要用A,虽然此时线程1中的A'=1,但线程2是从主存中复制的A=0,
                               即线程2中,A''=0。
      

  2.   

    理解是:每个线程有自己的栈和pc,方法调用通过栈帧的pop和push来实现。栈帧里面有局部变量、操作数等等。这些栈都可以访问一个JVM实例里面的方法区和堆。不知道这样理解对不对,期待大牛。
      

  3.   

    1. 所有数据都在主内存中。
    2. 线程运行时从主内存取数据,这里才到栈中,最后刷新回主内存(同多CPU cache模型),JAVA语言规范定义了6个原子操作:load,save,read,write,use,assign,用于线程内存同步。如果有synchronized,每个同步变量的操作先上锁-->read-->use/assign-->write-->解锁,完成同步过程。如果没有synchronized,不会上锁,都在线程本地操作,不保证数据的一致性。
      

  4.   

    推荐你看几个文章:JLS 第三版第17章——权威之作jsr133——JMM规范