学到了线程同步的地方,这个程序的运行过程不是很明白,方法M2前面的关键字synchronized去掉了,程序又是怎么运行的?程序如下,非常感谢!
public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}

public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}

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(tt.b);
}
}

解决方案 »

  1.   

    方法M2前面的关键字synchronized去掉了,M2就成了普通方法,但是在lz给出的程序中应该和没有去掉的效果一样。lz要弄同步的效果至少要启动两个线程才行。
      

  2.   

    我不是想弄出同步效果,现在我对这个synchronized关键字不是很理解,M2前面关键字synchronized去掉后运行结果不一样,我想知道MAIN主程序的运行过程,还有就是如果M2的关键字去掉了,M1已经锁上了,为什么还可以再M2里改变b的值呢?
      

  3.   

    m1加上关键字synchronized后,方法m1里的语句被锁定了,其他的线程就不可以在此时访问这个语句,而其他没有被锁定的方法,即没加上synchronized的就可以被其他线程访问,你上面的main语句中,当执行t.start()的时候,tt.m2()也开始执行,两个语句并行执行,当tt.m2执行完后执行打印语句.
      

  4.   

    LZ还需要注意一点t.start();只是表示线程已经准备好运行了
    但是不一定马上就run了
      

  5.   


    M1方法锁定,并不等于b这个变量被锁定,这个变量还是可以被改变的。一个对象上所有带synchronized的方法可以被看成一组,同时只能有一个线程进入其中一个方法,
    而其它没有synchronized的方法可以随便进入。如果想控制对一个变量的同步,可以单独对一个变量加锁(前提是这个变量要是一个对象,原子类型不可以):
    synchronized(b){
       
    }