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

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