在Java中,synchronized关键字用于实现线程之间的同步,以确保多个线程正确地访问共享资源或代码块。
Synchronized关键字有两种主要用法:
同步方法:将synchronized关键字应用于方法上,使整个方法成为同步的。这意味着在给定的时间内,只允许一个线程进入同步方法,并且其他线程必须等待。synchronized关键字就像是一把锁一样,打个比方:方法是一个厕所坑位,那么synchronized关键字就可以看作自动门锁,当一个线程进去上厕所时,门就会自动上锁。只有当厕所里的线程出来之后,锁才会打开,让下一个线程进入。以下是一个示例:
public class SynchronizedExample {
private int count = 0;
// 同步方法
public synchronized void increment() {
count++;
}
}
在上述示例中,increment方法使用synchronized关键字进行修饰,使得该方法在任何时刻只能被一个线程访问。这确保了对count变量的操作是原子性的,不会出现竞态条件。
同步代码块:将synchronized关键字应用于代码块,仅同步代码块的部分内容。通过指定一个锁对象,只有获取该锁对象的线程才能进入同步代码块执行,其他线程必须等待。以下是一个示例:
public class SynchronizedExample {
private int count = 0;
private Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
}
在上述示例中,我们使用对象lock作为锁,将count++操作放入synchronized同步块中。只有获取了lock对象的线程才能执行同步代码块中的操作,其他线程会被阻塞。
Synchronized关键字用于解决多线程并发访问共享资源时可能出现的问题,如数据不一致、竞态条件等。它确保了多线程操作的原子性和可见性。