今天面试遇到一关于多线程和匿名内部类的问题
[code="java"]
public class MultihreadTest {
private int a=1;
private int foo(){
return a++;
}
public void start(){
for(int i=0;i<5;i++){
new Thread(){
public void run(){
System.out.println(foo());
}
}.start();
}
}
public static void main(String args[]){
MultihreadTest a=new MultihreadTest();
a.start();
}
}
[/code]
如何修改上面代码 使其顺序打印1,2,3,4,5
函数方法改为 private synchronized int foo() {
实现线程同步,使得每次只有一个线程可以进入函数内部
因为a++不是一个原子操作,它是由先取,然后加,最后存三步组成
任何两个线程如果出现了交叉运行,就会出现错误。。。
但是因为a++的运行时间短的无法想象了,所以程序出现错误的概率估计是1/10000吧
但如果改成这样
private int foo(){
for(int i=0;i<100;++i) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a++;
}
return a;
}
}
显然结果就出问题了,所以必须进行线程同步才能保证万无一失。。。
[quote]如何修改上面代码 使其顺序打印1,2,3,4,5 [/quote]
本来打印顺序就是1,2,3,4,5
你测试了吗?
我测了一下,好像就是可以啊!
加上yield()