在多线程中我们往往需要保证数据的一致性,在Java中可以使用Synchronize互斥锁进行同步操作,下面我们来说一下不同的使用方式与区别。
方式一:锁定对象
class Test {
volatile int sum = 0;
// 同步方法,锁定该方法所在的对象,多线程调用同一对象的不同synchronized方法、synchronized(this)时互斥
public synchronized void incr1() {
sum++;
}
// 同步代码块,该写法与上述一致
public void incr2() {
synchronized (this) {
sum++;
}
}
}
方式二:锁定类
class Test {
volatile static int sum = 0;
// 静态同步方法,锁定的是当前方法的类对象(唯一),与static synchronized方法、synchronized(Test.class)互斥
public static synchronized void incr3() {
sum++;
}
// 非静态方法,锁定Test.class,该写法与上述一致
public void incr4() {
synchronized (Test.class) {
sum++;
}
}
}
总结:一定要分清楚Synchronized锁的是哪个对象,锁不同永不互斥。