Java中的synchronized
关键字是一个用于并发控制的关键字,它提供了一种简单的加锁机制来确保多线程环境下的数据一致性。通过使用synchronized
关键字,你可以指定一段代码或者一个方法在任何给定时间只能由一个线程访问,从而避免了多个线程同时修改共享资源导致的冲突和不一致。
synchronized
有两种基本用法:
修饰方法
当synchronized
关键字用来修饰一个方法时,整个方法体都被视为临界区(Critical Section),即同一时刻只有一个线程可以执行该方法。这确保了在该方法内部对共享资源的操作是原子性的,并且保证了可见性。例如:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
}
在这个例子中,increment()
和decrement()
方法都是同步的,因此在任何时候只有一个线程能够修改count
变量。
修饰代码块
你也可以将synchronized
关键字放在代码块上,以锁定特定的对象或类。在这种情况下,只有当前被锁定的对象才能进入同步代码块。这种方式提供了更大的灵活性,因为你可以根据需要选择锁定哪个对象。例如:
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
public void decrement() {
synchronized (lock) {
count--;
}
}
}
在这个例子中,我们创建了一个单独的对象lock
作为同步监视器,然后在每个操作中使用这个监视器。这样,即使有多个Counter
实例,每个实例也都有自己的独立锁。
总之,synchronized
关键字在Java中为多线程编程提供了一种简便的方式来管理并发,防止数据竞争和死锁等问题。然而,过度使用synchronized
可能导致性能下降和线程阻塞,因此在设计并发程序时需要仔细权衡。