加锁就一定能保证线程安全吗?

也就只有面试才会问出这种问题,这个问题不能简单回答是否,所有的面试问题都不能简单的回答是否,而应该讲清楚其中的原委,才能达到面试的目的。

 

回答这个问题首先要搞清楚什么才是线程安全的呢

在JMM内存模型中,有主内存和工作内存的概念,线程对数据的操作是将数据从主内存读取到当前线程的工作内存,修改后再刷到主内存,这过程可能导致另外的线程本地的工作内存中的数据没有及时更新而产生错误的操作,这就是线程安全问题。
简单点说,线程安全是指在多线程环境下,能够正确的操作共享数据。

 

怎么保证线程安全

一般通过加锁保证线程安全,但并不是只有加锁才能保证线程安全,加锁也并不能保证线程绝对安全。
保证线程安全的核心是对共享变量的操作,保证所有线程能正确的读写数据。

 

为什么加锁不能保证线程安全

那是因为错误的使用了锁:比如加不同的锁、读写锁混用、锁失效、锁的范围不能涵盖操作的数据、或者想通过volatile保证原子性。
使用同一个内置锁或显示独占锁才能保证线程安全。

 

分布式环境下锁的安全性

分布式环境下需要采用分布式锁,分布式锁的安全性问题更多,比如redis分布式锁可能出现业务执行时间大于锁的有效期,可以通过守护线程定时续期保证锁一致有效,或者主从复杂数据问题,锁数据还没同步到从节点,主节点挂了造成多锁,可以通过红锁实现分布式多实例锁解决等等。
 

版权声明:玥玥 发表于 2021-05-19 1:23:43。
转载请注明:加锁就一定能保证线程安全吗? | 女黑客导航