如何正确使用锁保护共享数据,协调异步线程
- 在消息队列中,“锁”是一个必须要使用的技术
- 使用锁其实会降低系统的性能
锁的原理:任何时间都只能有一个线程持有锁,只有持有锁的线程才能访问被锁保护的资源。
1. 避免滥用锁
使用锁的原则(参考性):如果能不用锁就不用锁;如果不确定是不是应该用锁,那也不要用锁。
使用锁的代价:
- 加锁和解锁需要CPU时间,是个性能的损失。等待锁过程是阻塞状态也会降低程序性能
- 锁使用不当容易造成死锁,导致程序卡死
只有在并发环境中,共享资源不支持并发访问,或者并发访问共享资源会导致系统的情况才需要使用锁。
2. 锁的用法
- 在访问共享资源之前,先获取锁
- 如果获取锁成功,就可以访问共享资源了
- 最后,需要释放锁,以便其他线程继续访问共享资源
使用锁的例子:
private Lock lock = new ReentrantLock();
public void visitShareResWithLock() {
lock.lock();
try {
// 在这里安全的访问共享资源
} finall