试下这个:
class t extends Thread {
private synchronized void f(){
try {
for( int i=0; i<10000000; i++ ) { m.n++; m.n--; }
} catch( Exception e ) {}
}
public void run() {
f();
}
}
class t extends Thread {
private synchronized void f(){
try {
for( int i=0; i<10000000; i++ ) { m.n++; m.n--; }
} catch( Exception e ) {}
}
public void run() {
f();
}
}
还是不对。
问过同事之后终于弄懂了。是我原先理解错误。假设类 c 有同步方法 f ,那么 c 就是个临界资源类型。从 c 生成对象 c1 ,c1 就是个具体的临界资源,JVM 为每个具体的临界资源维护一个等待队列。调用 c1.f() 时,就是对这个临界资源进行访问,所以会先请求加锁 c1, 如果请求加锁失败(比如已经有人加锁占用了 c1),就进入资源 c1 的等待队列。简单一点,使用同步的语句块:
synchronized ( 共享资源对象 ) { 不能被打断的语句序列... }
道理和同步方法一样。