class MyThread extends Thread{
int id;
static Object obj;
MyThread(int id){
this.id=id;
if(obj == null){
obj = = new Object();
}
}
public void run(){
synchronized (obj){
for(int i=0;i<1000;i++){//为什么i为100的时候是同步的?
System.out.println("My id is "+id);
}
}
}
}
int id;
static Object obj;
MyThread(int id){
this.id=id;
if(obj == null){
obj = = new Object();
}
}
public void run(){
synchronized (obj){
for(int i=0;i<1000;i++){//为什么i为100的时候是同步的?
System.out.println("My id is "+id);
}
}
}
}
zgysc:我觉得应该不是作用域的问题。书上也有将一个方法声明为同步化代码的例子。
同步run没有意义
创建了两个对象,不用synchronized 执行结果都是一样的
My id is 1和My id is 2。每一次运行结果都可能不一样。我的意思就是用同步的方法,先输出
My id is 1
My id is 1
My id is 1
……
再输出
My id is 2
My id is 2
My id is 2
……
今天在2002年程序员合订本里也看到关于次的说法:
“提醒
不要同步一个线程对象的run()方法,因为多线程需要运行run()。因为这些线程试图同步每一个对象,每个时间只有一个线程可以执行run()。结果是,每个线程都必须等待前一个线程终结之后才能访问run()。”