synchronized 线程锁问题。求教~(标题要够长,才能有人看)
public class TestSynchronized implements Runnable {
	int a = 100;	
	public synchronized void show1() {
	  a = 1000;
	  try{
	    Thread.sleep(5000);
	  }catch(InterruptedException e){}		  	
	  System.out.println("a = "+a);
	}	
	public  void show2(){	   
	  try {
	  Thread.sleep(2500);	
	  a = 2000;
	  }catch(InterruptedException e){}
   }     
    public void run() {
      show1();
    }      
   public static void main(String args[]) {
   TestSynchronized ts = new TestSynchronized();
   Thread tt = new Thread(ts);
   tt.start();
   ts.show2();
   System.out.println(ts.a); 	
   }
}
这是个简单的小例子,关键就去却与synchronized这个关键字上。我描述下问题。各位大大请看!
这个先是show1方法加了锁。用tt启动线程后,a被赋值成了1000后,show1进入睡眠状态 。主方法里又调用show2的方法。因为show2没有锁,所以a的值最后定位2000;
问题出在这里。
show2 加上了synchronized后。最后的结果都变成了1000.我想问的是~
是某两个方法加锁以后,必须执行完某一个方法,解锁后才能执行另一个有锁的方法吗?这个例题是有两个线程 一个是main的线程,一个是tt 线程。两个线程访问两个加锁的方法。只有一个方法执行完了才能执行另一个吗?
java里只有一个锁吗?
一直没有绕过这个弯,请熟悉的朋友来告诉下。谢谢
------解决方案--------------------
首先关于synchronized的理解可以参考我对另一个帖子的回复:
http://topic.csdn.net/u/20090712/08/780f7802-648d-471e-a319-3dce3e0d4e82.html
针对楼主的问题,当 show2 加上了synchronized 后,实际上两个方法用的是同一把锁(this)。所以 show1 和 show2 不可能同时执行。看看楼主的主程序,首先 tt.start() 然后 ts.show2(). 看起来好像应该 show1 先执行。但是产生新线程和开始线程都是比较耗资源的,所以 show2 先执行, show1 后执行。所以结果=1000