日期:2014-05-20  浏览次数:20694 次

求助!关于JAVA线程的一个问题
public class Test implements Runnable {

public static MyThread1 mt = new MyThread1();
public static void main(String[] args) {
Thread t = new Thread(new Test());
t.start();
new MyThread1().change();
}

@Override
public void run() {
mt.Show();
}
}

class MyThread1{

public synchronized void Show(){
System.out.println("a");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b");
}

public synchronized void change(){
System.out.println("1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
这样子它不是应该先打印:
1
2
a
b
可是结果却是:
1
a
b
2
它们都拿到锁了,不是该把change()里面的打印完才执行show()的吗。怎么会这样?!

------解决方案--------------------
你调用的是两个不同的方法,用synchronized进行线程同步是两个线程调用同一个方法时,
Thread t1 = new Thread(new Test());
Thread t2 = new Thread(new Test());
t1.start();
t2.start();
//new MyThread1().change();
然后运行一下,
和把show方法的synchronized去掉再运行的结果比较,看看有什么不同就知道了

------解决方案--------------------
你的synchonized是加在方法上的,所以必须针对的是同一个对象。如你的代码,你创建了两个不同的对象,两个线程各自在自己的对象上加锁,所以是相互不影响的。
------解决方案--------------------
你的synchonized是加在方法上的,所以必须针对的是同一个对象
我博客里就有 可以看看去