本帖最后由 zd1217 于 2009-07-04 20:56:01 编辑

解决方案 »

  1.   

    可以的,m2方法没有要求任何线程锁(monitor)
      

  2.   

    执行结果是调用m2方法的TT对象的b值
      

  3.   

    估计我可能是没理解线程同步执行结果是:
    1000
    b=1000第一个1000应该是主线程调用m2方法的结果,那个时候m1方法不被锁了吗?主线程肯定不能执行m1方法,为什么不是初始的100?
      

  4.   

    首先,如果一个类中有多个方法加锁了,那么一旦访问其中的一个方法,其他的不能够在被访问,但是没有加锁的方法依旧可以被访问;
    你的结果是:
    1000 
    b=1000 
    可以肯定的是,你的一个线程调用了方法m1,并执行了b=1000;这一句,之后他进入了睡眠,此时间种他的时间片轮换结束了,轮到另外一个线程执行并调用了方法m2,此时b的值已经修改了;所以结果是....
    一般情况下,如果你的b是临界变量,那么你应该同时加锁m2方法;
      

  5.   

    能执行,打印的b的值可能是100,也可能是1000.m1方法虽然是同步的,但是m2方法却不是。m1方法声明为同步的,并且是一个非静态方法(也叫对象级方法),所以,这个方法的执行是对这个对象本身加锁的。而m2方法非同步,所以进入时不需要对这个对象加锁,所以不会被锁住。m2方法的调用线程读取的是变量值本身的一份拷贝,这个要看这个拷贝是什么时候从变量值本身拷贝而来。换句话说,就是看读取b的时候,b的值有没有被m1写为1000.
      

  6.   

    看不懂啊看不懂.....你把main程序写出来....有点像马士兵讲的例子
      

  7.   

    类中的方法加锁,对其他不加锁方法是没有约束力的.
    方法m2()没有加锁,m1()加锁对它没有影响.因此,方法m2()随时可以执行,b结果可能为1000,也可能为100,取决于m1()执行的情况
      

  8.   

    写出main()容易就某个问题讨论。