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里只有一个锁吗?
一直没有绕过这个弯,请熟悉的朋友来告诉下。谢谢

解决方案 »

  1.   

    首先关于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
      

  2.   

    建议去看看api看看关键字synchronized