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

一个小程序
请看程序
public class TT implements  Runnable{
    public static void main(String[] args) throws Exception{
        TT tt=new TT();
        Thread t=new Thread(tt);
        t.start();
        Thread.sleep(2000);
        tt.m2();
    }

    int b=100;
    public  synchronized void m1() throws Exception{
        b=2000;
        System.out.println("b1="+b);
        Thread.sleep(5000);
        System.out.println("b2="+b);
    }

    public void m2(){
        b = 3000;
        System.out.println(b);
    }

    public void run() {
        try{
            m1();
        }
       catch(Exception ex){
        System.out.println(ex.getStackTrace());
    }}
}


这段程序的输出结果是
b1=2000
3000
b2=3000

我不明白的地方在于:m1已经将b这个变量锁定,为什么m2方法还能将其修改呢?

------解决方案--------------------
当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

只有当两个方法都是synchronized 且占有公共资源时,才会先执行完一个,再执行另一个
------解决方案--------------------
首先你锁定的是方法m1,而不是只有都是synchronized才会同时占有。否则你的main线程和run线程会同时只行的(理想状态下),在你执行run时m2是释放的,mian线程可以去执行的。你把第一个sleep的值改成6000,或者8000.你应该会看到不一样的结果