求助!关于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是加在方法上的,所以必须针对的是同一个对象
我博客里就有 可以看看去