面试题答案
一键面试可能出现的问题
- 数据不一致:当多个线程同时访问和修改同一个成员变量时,可能会导致数据不一致。例如,一个线程读取了变量的值,然后另一个线程修改了该值,第一个线程再使用之前读取的值进行操作,就会出现错误。
- 竞态条件:多个线程竞争访问共享资源,由于线程执行顺序的不确定性,可能导致程序产生不可预测的结果。
使用 synchronized
关键字解决问题
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在上述代码中,increment
方法和 getCount
方法都使用了 synchronized
关键字。这意味着当一个线程进入其中一个方法时,其他线程无法同时进入这两个方法中的任何一个,从而保证了 count
变量操作的原子性和一致性。
使用 Lock
接口解决问题
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
}
这里使用 ReentrantLock
实现 Lock
接口。在 increment
和 getCount
方法中,先调用 lock.lock()
获取锁,操作完成后在 finally
块中调用 lock.unlock()
释放锁,确保即使在操作过程中出现异常,锁也能被正确释放,从而保证多线程环境下对 count
变量操作的正确性。