Java面试题之多线程 什么是互斥锁?
互斥锁(Mutex,Mutual Exclusion)是一种用于控制对共享资源访问的同步机制。在多线程编程中,当多个线程需要访问同一资源(如变量、数据结构或文件)时,互斥锁可以确保在同一时刻只有一个线程能够访问该资源,从而避免数据竞争和不一致性的问题。
锁的获取:当一个线程想要访问共享资源时,它首先尝试获取互斥锁。如果锁当前是可用的,线程就可以成功获取锁并访问资源;如果锁已经被其他线程持有,当前线程将被阻塞,直到锁被释放。
锁的释放:当线程完成对共享资源的操作后,它必须释放互斥锁,以便其他线程可以获取锁并访问资源。
在Java中,互斥锁可以通过多种方式实现,最常见的方式是使用 synchronized
关键字和 ReentrantLock
类。
synchronized
关键字public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在这个例子中,increment
和 getCount
方法被声明为 synchronized
,这意味着同一时间只有一个线程可以执行这些方法,从而保证了对 count
变量的安全访问。
ReentrantLock
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private int count = 0;
private final ReentrantLock 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
提供了更灵活的锁机制,允许尝试获取锁、定时锁等功能。
互斥锁是多线程编程中非常重要的概念,它帮助我们管理对共享资源的访问,确保数据的一致性和完整性。在使用互斥锁时,需要注意避免死锁和性能问题。