面试题答案
一键面试常见解决线程安全问题的方法
- 同步方法:使用
synchronized
关键字修饰方法,该方法在同一时间只能被一个线程访问。 - 同步块:使用
synchronized
关键字定义一个代码块,对共享资源的访问在该代码块内进行同步。 - 使用
Lock
接口:java.util.concurrent.locks.Lock
提供了比synchronized
更灵活的锁控制。 - 使用线程安全的类:如
java.util.concurrent
包下的ConcurrentHashMap
等,这些类内部实现了线程安全机制。
同步块在实际代码中的应用示例
public class SynchronizedBlockExample {
private static int counter = 0;
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
synchronized (SynchronizedBlockExample.class) {
counter++;
}
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
synchronized (SynchronizedBlockExample.class) {
counter++;
}
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final counter value: " + counter);
}
}
在上述代码中,synchronized
块确保了 counter
的自增操作是线程安全的,两个线程并发执行自增操作不会导致数据不一致问题。