synchronized关键字可以用于实现线程之间的同步,它可以修饰方法或代码块,保证在同一时间只有一个线程能够访问被synchronized修饰的代码。
synchronized会在以下情况下释放锁:
- 代码块执行完毕: 当一个线程执行完了一个被synchronized修饰的代码块时,它会释放锁,以允许其他线程访问这个代码块。
public synchronized void synchronizedMethod() {
// 同步代码块开始
// ...
// 同步代码块结束,释放锁
}
2异常抛出: 如果一个线程在执行synchronized代码块时抛出了异常,JVM会自动释放锁,以免造成死锁。
public synchronized void synchronizedMethod() {
// 同步代码块开始
// ...
if (someCondition) {
throw new SomeException();
}
// 同步代码块结束,即使抛出异常,也会释放锁
}
3调用wait()方法: 当一个线程在一个对象上调用wait()方法时,它会释放这个对象的锁,使得其他线程能够访问这个对象。
synchronized (lock) {
lock.wait();
}
4调用notify()或notifyAll()方法: 当一个线程在一个对象上调用notify()或notifyAll()方法时,它会唤醒等待在这个对象上的一个或多个线程,这些线程会尝试获取对象的锁。
synchronized (lock) {
lock.notify();
}
综上所述,synchronized会在代码块执行完毕、异常抛出、调用wait()方法以及调用notify()或notifyAll()方法时释放锁。