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

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

 

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

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

 

怎么保证线程安全

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

 

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

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

 

分布式环境下锁的安全性

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

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值