public class Vertical {
   private int alt;
   public synchronized void up(){
      ++alt;
   }
   public void down(){
      --alt;
   }
   public synchronized void jump(){
      int a = alt;
      up();
      down();
      assert(a==alt);
   }
}
不定项选择:
a)代码将无法被编译。
b)相互独立的线程可以并发执行up()方法。
c)相互独立的线程可以并发执行down()方法。
d)相互独立的线程可以并发执行up()和down()方法。
e)在jump()方法中的断言在任何情况下都不会失效。请说明下理由。

解决方案 »

  1.   

    我只敢选e,估计不对,但是题目本身不严密,连main函数都没。
      

  2.   

    我咋看 b c d e 都是对的呢
    具体我也说不清楚  哎 基础不好
      

  3.   

    b c 和 d  不可能共存吧?
      

  4.   

    d)相互独立的线程可以并发执行up()和down()方法。
    我觉得应该是d,因为synchronized 会获得当前对象的监视器(锁),也就是进入up()方法,这个时候获得锁,只要锁不释放,那其它线程就没办法进入当前对象的同步方法;当另一个线程进来的时候只可以访问当前对象的非同步方法down();没有加synchronized 的方法无须获得对象锁
      

  5.   

    c)相互独立的线程可以并发执行down()方法。 这个也对
      

  6.   

    b)相互独立的线程可以并发执行up()方法。
    c)相互独立的线程可以并发执行down()方法。
    d)相互独立的线程可以并发执行up()和down()方法。 

    我怎么把 d 理解成 c + d 呢。
      

  7.   

    写错了
    b)相互独立的线程可以并发执行up()方法。
     c)相互独立的线程可以并发执行down()方法。
     d)相互独立的线程可以并发执行up()和down()方法。
     我怎么把 d 理解成 c + b 呢。
      

  8.   

    a)代码将无法被编译。 
       这个不对的话下面可以不用看了,跟java版本有关,看考试目标,这个可以排除。b)相互独立的线程可以并发执行up()方法。
       synchronized方法,一个线程执行了,其他线程就别指望了,错。
     
    c)相互独立的线程可以并发执行down()方法。
    对。
     
    d)相互独立的线程可以并发执行up()和down()方法。
    感觉文字表达有歧义,不知道出题的人到底想说什么。
     
    e)在jump()方法中的断言在任何情况下都不会失效。 
    错。
    让另一个线程不断调用down,很容易测试。
      

  9.   

    c和d不矛盾阿,c肯定对的不用说(没有枷锁)。至于d, up方法加锁的意思是同一时刻只能有一个线程访问该方法,但是alt变量在同一时刻可以由不同的方法访问,虽然up被加了锁--同一时刻只有一个线程访问up,但另一个线程可以通过另一个方法方法访问并改变alt的值。
      

  10.   

    d)相互独立的线程可以并发执行up()和down()方法。
    感觉文字表达有歧义,不知道出题的人到底想说什么。????
    这个表达不是很明确吗?有什么歧义?这个明显也对的
      

  11.   

    d:相互独立的线程可以并发执行up()和down()方法
    比如说  线程1  执行up,需要获得当前对象锁,线程2执行down,由于down是非同步方法,这个时候无须获得当前对象锁(就算当前对象锁被线程1占用,还是可以进入当前对象锁非同步方法)
      

  12.   

    这个题相当脑残。我越听越糊涂,也不知道SUN公司想考什么?
      

  13.   


    想考你对线程的理解啊,做java的对线程如果一点也不了解,那算不上学过java,多线程其实很复杂的,是熟练掌握至少要5年以上,牛XX的人除外
      

  14.   

    C、D
    每个对象只有一把对象锁,同步方法的执行需要先获取锁,当该对像的其中一个同步方法在执行时(它此时已持有该锁),其它同步方法因无法获得锁,而只能等待。
    方法down()是非同步的,既它的执行不需对象锁,故可以被多个线程同时执行。
    up()方法是同步的,它需要先获得对象锁后才可执行,但当它执行时,down()方法依然可以被其它的线程执行,因为down()不需要锁就可以执行。
      

  15.   

    c  d:相互独立的线程可以并发执行up()和down()方法 -- 相互独立线程,1个执行up(),另一个执行 down(),这个时候是可以的。
    但不能排除 2个线程并发执行up(),这样还不是照样错。
    当然我这样想有点挑字眼了。
      

  16.   

    在jump()方法中的断言在任何情况下都不会失效。 这个选项的错误在于 如果并发调用up();down();另外一个线程就会停止在up()方法上所以就失效了?请大虾解释一下?^_^!
      

  17.   

    e 问题其实最有价值,这个问题的关键,是在考察 ++ 和 -- 操作是否线程安全
    这两个操作在并发的时候都是不安全的,在计算机内部会分成两个步骤进行,如果不放在同步方法里,就可能出现错误
    比如初始值 i = 1, 两个线程并发执行 ++i, 其中一个++ i 执行后取得的结果可能等于 3b 选项的意思是两个线程同时调用 up
    c 选项的意思是两个线程同时调用 down
    d 选项的意思是两个线程并发,一个调用 up,一个调用 downb c d 三个选项问的是会不会有一个线程要等待另一个线程从方法中退出后,才可以执行方法内的代码
    所以这三个问题完全是相同的问题在不同情况下有什么结果,但没有什么重复的现在,大家明白结果为什么是 c d 了吧?
      

  18.   

    bcde都是对的就是考个synchronized用方法上锁对象的事情bcd都是一个意思,没做同步,只要没调用到jump,就不会产生锁,对象就不会被锁住,大家就随便用,不用排队了,至于结果是不是预期的就看运气了,呵呵e嘛,当然了,对象被锁住,当一个调用进来,就只有他一个人用了加一再减一,怎么都会回到原来的值,没什么异议所以最终答案,bcde
      

  19.   

    方法级的同步锁是锁在整个对象身上的
    如果像你说的标准答案那样,java就没必要后来更新同步锁的方式,出现更优化的同步锁定类以及方法了
    因为这种优化就是为了保证当某两个线程处理的属性不冲突的时候,彼此间不用排队的问题。所以我是觉得那个标准答案比较奇怪,有点怀疑
    当然,也许是我对同步的理解错了吧
      

  20.   

    有歧义的,只是你真好想到正解方法罢了
    这句话也可以理解:4个相互独立的线程(A,B,C,D)A和B可以并发访问up()方法,C和D可以并发访问down()方法,那这么说来不就是错误的么。所以说这题有歧义,也许是我理解错误了吧
      

  21.   

    e.
    jump中的up方法无法得到同步锁