在并发编程中,当多个线程竞争共享资源时,为了实现对共享资源的访问互斥,通常使用 synchronized 关键字进行加锁,在 Java 中,每一个对象都可以作为锁
synchronized 的三种使用方式 修饰代码块
static int count = 0;
static Object lock = new Object();
synchronized (lock) {
count++;
}
synchronized (lock) {
count--;
}
创建 Object 对象 lock 作为锁,对于 count 的自增自减操作,都使用 synchronized 对代码块加锁,当一个线程对 count 进行自增或自减操作时,另外的线程由于获取不到 lock 锁而被阻塞,直到执行完毕,释放锁后,另外的线程才有机会获取锁,保证了临界区的内代码的原子性
修饰普通方法使用 synchronized 修饰普通方法
public class SynchronizedTest {
public synchronized void test() {
}
}
等价于
public class SynchronizedTest {
public void test() {
synchronized (this) {
}
}
}
此时锁是当前调用方法的对象
修饰静态方法使用 synchronized 修饰静态方法
public class SynchronizedTest {
public synchronized static void test() {
}
}
等价于
public class SynchronizedTest {
public static void test() {
synchronized (SynchronizedTest.class) {
}
}
}
此时锁是当前类的 class 对象



