小弟菜鸟一只,如下问题不得其解,求高手解答。
示例代码如下:(代码来源:“Denlee的一片天”,谢谢“Denlee的一片天”)
public class MainThread extends Thread { int i = 0; /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
MainThread m1 = new MainThread();
MainThread m2 = new MainThread();
MainThread m3 = new MainThread();
MainThread m4 = new MainThread();
MainThread m5 = new MainThread();
MainThread m6 = new MainThread();
m1.start();
m2.start();
m3.start();
m4.start();
m5.start();
m6.start(); } public synchronized void t1() {
i++;
// Each thread gets into its own t1 and print out its own i
System.out.println(Thread.currentThread().getName() + " " + i);
                // Suspend
                while(true){
                }
} public void run() {
synchronized (this) {
while (true) {
t1();
}
}
}
}
代码运行的结果是:所有的Thread对象都可以畅通无阻的进入t1执行。
根据JVM的说法,同一个Class的所有Instance的相同的Method在方法区都只有一块内存分配。也就是说,上面代码中的t1()只有一块内存。每个线程执行t1()的时候都会创建一个stack frame,copy那个t1()的执行码和局部变量等信息加入自己的Stack,然后执行。
我现在的问题是:即使synchronized (this)无效(因为有多个instance,实际上有多个"this"),那么对于只有一块内存的t1(),synchronized void t1()应该起作用的。当m1线程进入t1()运行到while(true),后面的线程应该被block才对,但是这些线程仍旧畅通无阻的执行t1()。
难道同一个Class产生的不同的Instance中相同的Method在方法区对应不同的内存块?还是synchronized加锁的时机有什么玄机?
盼高人解答。或者介绍一些好的文档解惑。
(小弟分不多,平时靠偷偷摸摸的下载一些文档蹭分,给出1/3的分数求解,望高人不要嫌弃分少)。