synchronized块必须给定一个在其上进行同步的对象,最合理的方式是:使用其方法正在被调用的当前方法:synchronized(this)。
但是有的时候必须在另一个对象上同步。
我们看两个代码的例子:
1.
package com.wjy.test;
public class Dualsynch{
private Object myObject=new Object();
public synchronized void f(){
for(int i=0;i<10;i++){
System.out.println("I am f function.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void g(){
synchronized (this) {
for(int i=0;i<10;i++){
System.out.println("I am g function.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
测试代码:
package com.wjy.test;
public class TestMain {
public static void main(String args[]) {
final Dualsynch dualsynch=new Dualsynch();
new Thread(){
public void run(){
dualsynch.f();
}
}.start();
dualsynch.g();
}
}
运行结果:
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
很明显,进程发生了阻塞。但是修改代码synchronized(this)中的this后,救国救民不同了,因为两个函数(f 和 g)是在不同对象上同步的。
2
package com.wjy.test;
public class Dualsynch{
private Object myObject=new Object();
public synchronized void f(){
for(int i=0;i<10;i++){
System.out.println("I am f function.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void g(){
synchronized (myObject) {
for(int i=0;i<10;i++){
System.out.println("I am g function.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
测试代码没有变,看看结果:
I am g function.
I am f function.
I am f function.
I am g function.
I am f function.
I am g function.
I am g function.
I am f function.
I am f function.
I am g function.
I am g function.
I am f function.
I am g function.
I am f function.
I am g function.
I am f function.
I am f function.
I am g function.
I am f function.
I am g function.