MST
星途 面试题库

面试题:Java类成员变量与方法在多线程环境下的表现

假设一个Java类中有一个成员变量和几个方法,在多线程并发访问时,可能会出现哪些问题?如何通过合理的同步机制(如synchronized关键字、Lock接口等)来解决这些问题?请结合具体代码示例阐述。
38.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 数据不一致:当多个线程同时访问和修改同一个成员变量时,可能会导致数据不一致。例如,一个线程读取了变量的值,然后另一个线程修改了该值,第一个线程再使用之前读取的值进行操作,就会出现错误。
  2. 竞态条件:多个线程竞争访问共享资源,由于线程执行顺序的不确定性,可能导致程序产生不可预测的结果。

使用 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 接口。在 incrementgetCount 方法中,先调用 lock.lock() 获取锁,操作完成后在 finally 块中调用 lock.unlock() 释放锁,确保即使在操作过程中出现异常,锁也能被正确释放,从而保证多线程环境下对 count 变量操作的正确性。