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()方法中的断言在任何情况下都不会失效。请说明下理由。
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()方法中的断言在任何情况下都不会失效。请说明下理由。
具体我也说不清楚 哎 基础不好
我觉得应该是d,因为synchronized 会获得当前对象的监视器(锁),也就是进入up()方法,这个时候获得锁,只要锁不释放,那其它线程就没办法进入当前对象的同步方法;当另一个线程进来的时候只可以访问当前对象的非同步方法down();没有加synchronized 的方法无须获得对象锁
c)相互独立的线程可以并发执行down()方法。
d)相互独立的线程可以并发执行up()和down()方法。
我怎么把 d 理解成 c + d 呢。
b)相互独立的线程可以并发执行up()方法。
c)相互独立的线程可以并发执行down()方法。
d)相互独立的线程可以并发执行up()和down()方法。
我怎么把 d 理解成 c + b 呢。
这个不对的话下面可以不用看了,跟java版本有关,看考试目标,这个可以排除。b)相互独立的线程可以并发执行up()方法。
synchronized方法,一个线程执行了,其他线程就别指望了,错。
c)相互独立的线程可以并发执行down()方法。
对。
d)相互独立的线程可以并发执行up()和down()方法。
感觉文字表达有歧义,不知道出题的人到底想说什么。
e)在jump()方法中的断言在任何情况下都不会失效。
错。
让另一个线程不断调用down,很容易测试。
感觉文字表达有歧义,不知道出题的人到底想说什么。????
这个表达不是很明确吗?有什么歧义?这个明显也对的
比如说 线程1 执行up,需要获得当前对象锁,线程2执行down,由于down是非同步方法,这个时候无须获得当前对象锁(就算当前对象锁被线程1占用,还是可以进入当前对象锁非同步方法)
想考你对线程的理解啊,做java的对线程如果一点也不了解,那算不上学过java,多线程其实很复杂的,是熟练掌握至少要5年以上,牛XX的人除外
每个对象只有一把对象锁,同步方法的执行需要先获取锁,当该对像的其中一个同步方法在执行时(它此时已持有该锁),其它同步方法因无法获得锁,而只能等待。
方法down()是非同步的,既它的执行不需对象锁,故可以被多个线程同时执行。
up()方法是同步的,它需要先获得对象锁后才可执行,但当它执行时,down()方法依然可以被其它的线程执行,因为down()不需要锁就可以执行。
但不能排除 2个线程并发执行up(),这样还不是照样错。
当然我这样想有点挑字眼了。
这两个操作在并发的时候都是不安全的,在计算机内部会分成两个步骤进行,如果不放在同步方法里,就可能出现错误
比如初始值 i = 1, 两个线程并发执行 ++i, 其中一个++ i 执行后取得的结果可能等于 3b 选项的意思是两个线程同时调用 up
c 选项的意思是两个线程同时调用 down
d 选项的意思是两个线程并发,一个调用 up,一个调用 downb c d 三个选项问的是会不会有一个线程要等待另一个线程从方法中退出后,才可以执行方法内的代码
所以这三个问题完全是相同的问题在不同情况下有什么结果,但没有什么重复的现在,大家明白结果为什么是 c d 了吧?
如果像你说的标准答案那样,java就没必要后来更新同步锁的方式,出现更优化的同步锁定类以及方法了
因为这种优化就是为了保证当某两个线程处理的属性不冲突的时候,彼此间不用排队的问题。所以我是觉得那个标准答案比较奇怪,有点怀疑
当然,也许是我对同步的理解错了吧
这句话也可以理解:4个相互独立的线程(A,B,C,D)A和B可以并发访问up()方法,C和D可以并发访问down()方法,那这么说来不就是错误的么。所以说这题有歧义,也许是我理解错误了吧
jump中的up方法无法得到同步锁