面试题答案
一键面试使用 synchronized
关键字
- 原理:
synchronized
关键字可以修饰方法或代码块。当一个线程进入被synchronized
修饰的方法或代码块时,它会自动获取对象的锁。其他线程在锁被释放之前无法进入该同步区域,从而保证同一时间只有一个线程能访问共享资源。 - 示例代码:
public class Server {
private int clientCount = 0;
// 同步方法
public synchronized void incrementClientCount() {
clientCount++;
}
public synchronized int getClientCount() {
return clientCount;
}
}
在上述代码中,incrementClientCount
和 getClientCount
方法都被 synchronized
修饰,这样在多线程环境下,对 clientCount
的读写操作都是线程安全的。
使用 ReentrantLock
- 原理:
ReentrantLock
是一个可重入的互斥锁,它提供了比synchronized
更灵活的锁控制。线程在进入临界区前需要调用lock()
方法获取锁,在离开临界区时调用unlock()
方法释放锁。 - 示例代码:
import java.util.concurrent.locks.ReentrantLock;
public class ServerWithLock {
private int clientCount = 0;
private ReentrantLock lock = new ReentrantLock();
public void incrementClientCount() {
lock.lock();
try {
clientCount++;
} finally {
lock.unlock();
}
}
public int getClientCount() {
lock.lock();
try {
return clientCount;
} finally {
lock.unlock();
}
}
}
在上述代码中,通过 ReentrantLock
的 lock()
和 unlock()
方法来控制对 clientCount
的访问,确保线程安全。注意在 try - finally
块中释放锁,以保证即使出现异常,锁也能被正确释放。