package com.woxiaoe.study.thread;
class DualSynch{
private Object syncObject = new Object();
public synchronized void f(){
for(int i = 0; i < 5; i++){
System.out.println("f()");
Thread.yield();
}
}
public void g(){
synchronized (this) {
for(int i = 0; i < 5; i++){
System.out.println("g()");
Thread.yield();
}
}
}
}
public class SyncObject {
public static void main(String[] args) {
final DualSynch ds = new DualSynch();
new Thread(){
public void run() {
ds.f();
};
}.start();
ds.g();
}
}
Output:
g()
g()
g()
g()
g()
f()
f()
f()
f()
f()
synchronized快必须给定一在其上进行同步的对象,并且最合理的方式是,使用其方法正在被调用的当前对象:synchronized(this),就如上面代码所示,在这种方式中,如果获得了synchronized快上的锁,那么该对象其他的synchronized方法和临界区就不能被调用了.就如上面的代码,因为g()中位对当前对象(this)同步,所以f()方法要等到其执行往后再执行。
如果我们把this改为syncObject 那么这是的输出就为:
g()
f()
g()
f()
g()
f()
g()
f()
g()
f()
即二者同时运行。这种方式必须确保所有相关的任务都是在同一个对象上同步的。

被折叠的 条评论
为什么被折叠?



