六: 高并发下如何安全修改同一行数据

多个用户下订单, 生成全局自增的订单ID
定义全局变量 a =0,
启动50 个线程 生成50 个订单id 时 a+1, 会有重复的订单id 出现。 线程不安全

解决:

一:基于 jvm 解决方式。
1.将全局变量, 自增时得代码块 加Synchorized 关键字
2. lock lock= new ReentranLock()
try{
lock.lock()
将全局变量, 自增时得代码块
}finally{
lock.unlock();
}

二: 分布式 解决方式
数据库锁 : 悲观锁。。。。性能非常差
redis 锁 : 容易产生死锁

Zookeeper 锁

数据监听触发器
六: 高并发下如何安全修改同一行数据_第1张图片

持久节点, 与zookeeper 客户端 断开 数据还存在
临时节点:与zookeeper 客户端 断开 数据还不存在

不带变编号的节点:create aaa 后 再 create aaa 会报错
带编号的节点:create aaa 生成 aaa_000001 的编号节点
再create aaa 不会报错 生成aaa_000002 的编号节点
六: 高并发下如何安全修改同一行数据_第2张图片

基于异常的分布式锁(基于临时节点)
创建不带序号的节点, 创建成功获得锁, 创建不成功, 会抛出异常, 监听lock 节点, 当lock 删除时,再重新去创建节点

六: 高并发下如何安全修改同一行数据_第3张图片

基于相互监听(性能高, 占用资源, 基于临时带序号的节点)
六: 高并发下如何安全修改同一行数据_第4张图片

你可能感兴趣的:(面试题)