MST

星途 面试题库

面试题:Java多线程编程中,如何解决线程安全问题

在Java多线程编程场景下,经常会遇到线程安全问题。请阐述几种常见的解决线程安全问题的方法,并举例说明其中一种方法在实际代码中的应用。
13.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

常见解决线程安全问题的方法

  1. 同步方法:使用 synchronized 关键字修饰方法,该方法在同一时间只能被一个线程访问。
  2. 同步块:使用 synchronized 关键字定义一个代码块,对共享资源的访问在该代码块内进行同步。
  3. 使用 Lock 接口java.util.concurrent.locks.Lock 提供了比 synchronized 更灵活的锁控制。
  4. 使用线程安全的类:如 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 的自增操作是线程安全的,两个线程并发执行自增操作不会导致数据不一致问题。