public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{

b = 1000;
System.out.println("I am  m1");
Thread.sleep(2000);
System.out.println("m1 : b = " + b);
}

public synchronized void m2() throws Exception {
b = 2000;
System.out.println("I am  m2");
Thread.sleep(2500);

}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println("main:"+tt.b);
}
}运行了多次次,出了两个结果。结果1:I am  m2
I am  m1
main:1000
m1 : b = 1000结果2:I am  m2
main:2000
I am  m1
m1 : b = 1000请问是不是看谁的线程先拿到当前对象的锁啊,新手一个,希望大虾们解释下。
这个sychronized 关键字也不是理解得很透彻?谢谢

解决方案 »

  1.   

    楼主的实验挺有意思,不过这个实验似乎并不适合体会synchronized,因为你并没有两个线程都去调用同一个同步方法。
      

  2.   

     搂主这个程序的主要情况是展示时间片的轮换,基本和synchronized无关,真正的synchronized使用是需要你去调用同一个参数或者方法,synchronized不能用来锁线程,也许你可以使用join()和yield()来操作。
     时间片的实验你可以在2个线程类里面写打印1到100的run(),你在main()里面前后启动他们,会发现不同的打印顺序,常用的实例就是赛马程序
      

  3.   

    synchronized  修饰方法:在方法中,只能让一个线程进入,不说是锁入了里面的变量.