在Java中,`synchronized` 关键字可以用于同步类方法,以确保在同一时刻只有一个线程可以执行该方法。这对于防止多线程环境下对共享资源的并发访问冲突非常有用。
以下是一个使用 `synchronized` 关键字同步类方法的示例:
public class Counter {
// 私有共享资源
private int count = 0;
// 使用 synchronized 同步类方法
public synchronized void increment() {
count++; // 假设这是一个复杂的操作,需要同步
}
// 另一个方法,为了展示不是所有方法都需要同步
public void display() {
System.out.println("Current count is: " + count);
}
public static void main(String[] args) {
// 创建Counter对象
Counter counter = new Counter();
// 创建两个线程来模拟并发
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
// 启动线程
t1.start();
t2.start();
// 等待线程完成
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 显示最终结果
counter.display();
}
}
在这个示例中,`increment` 方法被声明为 `synchronized`,这意味着在同一时刻,只有一个线程可以执行这个方法。这确保了 `count` 变量的更新是线程安全的,即使在多个线程同时尝试修改它的情况下。而 `display` 方法则没有被同步,因为它只是读取 `count` 的值,并且读取操作在大多数情况下是线程安全的(尽管在复杂的并发场景中,可能需要其他形式的同步来确保数据的可见性)。
请注意,虽然 `synchronized` 方法提供了线程安全的保障,但它也可能引入性能瓶颈,因为每次只有一个线程可以执行该方法。在设计多线程程序时,应该仔细考虑何时以及如何应用同步机制。