Java中synchronize关键字用于进行线程间的同步。synchronize同步块根据同步级别不同,可分为三个层次:
一、单个对象的同步。每个方法可以同步到不同的对象,对象之间是相互独立的。
private Object synObject1 = new Object();
private Object synObject2 = new Object();
}
public void f1() {
synchronized (synObject1) {
//TODO
}
}
public void f2() {
synchronized (synObject2) {
//TODO
}
}
f1与f2分别同步到不同的对象上,只要获得相应同步对象的对象锁,线程就可以运行。
二、同步到当前类实例对象上。当某一个方法同步到当前的类实例对象上时,线程只有获得当前类实例的对象锁才可以继续运行。同步到当前类实例对象上有两种方法:
1、同步对象设为this。
public void f3() {
synchronized (this) {
//TODO
}
}
2、在方法上使用synchronize关键字。
public synchronized void f4() {
// TODO
}
三、同步到当前类实例上。当使用一个静态对象作为同步对象时,线程只有获得当前类实例时,才可以继续运行,也就是所谓的类锁。也可以直接获取当前类实例来作为同步对象,有两种方法:
1、使用xxx.class
public class Test {
public void f6() {
synchronized (Test.class) {
// TODO
}
}
}
2、使用Class.forName(XXXX);
public class Test {
public void f7() throws ClassNotFoundException {
synchronized (Class.forName("com.example.Test")) {
// TODO
}
}
}