如题, 已经对m1方法锁定,b=1000应该就不能被访问了吧
可是运行main 方法,结果是1000  b=1000
按道理应该是100 b=1000 呀?求高人解答public class TT implements Runnable{
int b = 100;
public synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b="+b);
} public void m2(){
System.out.println(b);
}

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(); Thread.sleep(1000);
tt.m2();
}
}

解决方案 »

  1.   

    b再m1()中不赋值1000了。执行m2()输出1000很正常啊。m1()执行一次就结束了,锁就被释放掉了啊
      

  2.   

    同步不同步都无所谓,这属于时间问题。在主线程中,当开启新的线程后,主线程Thread.sleep(1000);等待了1000ms,所以导致主线程的后半部分落后于新开启的线程执行。
    在m1()中将b = 1000;和Thread.sleep(5000);调换顺序就能解决。
    当然在高负载的机器上不一定就说明你的程序有问题,有由正确的情况发生。
      

  3.   


    public class TT implements Runnable {
    int b = 100; public synchronized void m1() throws Exception {
    b = 1000; // flag-1
    Thread.sleep(5000); // flag -2 
    System.out.println("b=" + b);
    } public void m2() {
    System.out.println(b);
    } 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(); // 该线程是否在 start 后马上运行并不确定。需要根据时间片来决定。(跟操作系统的实现以及硬件有关)
    // 所以很有可能这里没有启动线程 t
    Thread.sleep(1000); // 当前主线程 sleep 后 t 得到运行。执行 flag-1 处。然后 t 在 flag-2  处 sleep. 
    tt.m2(); // 主线程比 t 先醒。 运行此处 so 打印 1000 
    //主线程运行完毕 t 运行 so 打印 b =1000
    }
    }
      

  4.   

    同学,你还没有熟悉线程的基本概念,这里只有两个线程, main和t线程, 如果你要设计成抢资源的情况,才需要同步的.<quote>如题, 已经对m1方法锁定,b=1000应该就不能被访问了吧</quote>“谁锁谁”的问题你要清楚, 比如去趟厕所,甲(线程一)进去了,才会lock,防止乙(线程二)进去,没事, 也不至于锁着厕所,占位不拉屎吧!厕所就是这里的资源, 你这里没有这种情况, 锁有什么意义呢!你这种情况,就好比野猫和野狗拉巴巴, 野狗拉在树丛中,野猫拉在沙滩上,不干对方事的. 就没有“同步”之说了。  即使狗锁住了它的范围,猫同学也不鸟它,去沙滩方便得了!