面试题答案
一键面试同步块(synchronized block)
- 适合场景:
- 当你只需要同步代码中的一小部分关键代码,而不是整个方法时,使用同步块。这样可以减少锁的粒度,提高并发性能。
- 当需要对不同的对象使用不同的锁时,同步块能灵活地指定锁对象。
- 示例:
public class SynchronizedBlockExample {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
// 这里是需要同步的代码块
System.out.println("Method 1 is synchronized using lock1");
}
}
public void method2() {
synchronized (lock2) {
// 这里是需要同步的代码块
System.out.println("Method 2 is synchronized using lock2");
}
}
}
在上述示例中,method1
和method2
使用不同的锁对象(lock1
和lock2
),这样如果method1
和method2
被不同线程调用,只要不是操作相同锁对象对应的同步块,它们可以并发执行,提高了并发性能。
同步方法(synchronized method)
- 适合场景:
- 当整个方法的执行需要保证线程安全,即方法内的所有操作都需要在同一时间只有一个线程执行时,适合使用同步方法。
- 代码逻辑相对简单,整个方法的原子性操作是必须的场景。
- 示例:
public class SynchronizedMethodExample {
private int count = 0;
public synchronized void increment() {
count++;
System.out.println("Incremented count: " + count);
}
}
在这个例子中,increment
方法被声明为synchronized
,这意味着在任何时刻,只有一个线程可以调用这个方法,保证了count
变量自增操作的线程安全性。