2. 使用分布式锁解决
通过上面的案例使用JDK的锁解决不了分布式场景下的并发安全问题,接下来就考虑使用分布式锁来解决了。
2.1. 解决方案概述
分布式锁有很多种方案
这些方案可以使用一个设计模式来统一
2.2. 模板方法模式
2.2.1. 模板方法介绍
在父类中编排主流程,将步骤实现延迟到子类去实现。
上图网上购物的时候总体4个流程
-
清点商品
-
计算价格
-
支付(未知扩展)
-
送货上门
2.2.2. 代码实现
package cn.enjoy.template;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class AbstractTemplate {
public void shopping() {
Map<String,Float> cars = new HashMap();
cars.put(“电池”,10f);
cars.put(“娃娃”,20f);
cars.put(“打气筒”,30f);
//1.清点商品
checkGoods(cars);
//2计算价格
float mony = calculation(cars);
//3.支付
if(pay(mony)) {
//4.如果支付成功送货
delivery();
}
}
public void checkGoods(Map<String,Float> cars) {
if(cars!=null) {
System.out.print(“你购买的了:”);
for(String key:cars.keySet()) {
System.out.print(key+" ");
}
System.out.println();
}
}
public float calculation(Map<String,Float> cars) {
float result = 0;
if(cars!=null) {
for(String key:cars.keySet()) {
result += cars.get(key);
}
}
System.out.println(“你总共应该支付:”+result);
//钱
return result;
}
public abstract boolean pay(Float money) ;
public void delivery() {
System.out.println(“请稍等,小哥哥正在送货!”);
}
}
对于支付来说是【未知的扩展】因此它是个抽象的方法,如果想使用微信支付可以重现pay方法
2.3. 分布式锁的模板方法
2.3.1. 概览
1、定义锁的接口Lock
2、在AbstractLock模板锁里面实现getLock方法,实现通用的逻辑。
3、不能确实的步骤,作为虚拟方法,甩锅给子类实现。
4、子类只需要聚焦自己的小步骤逻辑,实现tryLock,waitLock,unLock方法
2.3.2. 代码实现
实现tryLock,waitLock,与Lock接口的unLock方法
2.4. MySql实现方式
2.4.1. 实现思路
利用数据库自身提供的锁机制实现,要求数据库支持行级锁;
2.4.2. 实现流程
2.4.3. 代码
2.4.3.1. Mysql分布式锁的实现
2.4.3.2. 修改Controller
增加分布式锁
2.4.4. 测试
搞定分布式安全问题
2.5. ZK实现方式
2.5.1. 实现思路
基于zk的节点特性以及watch机制实现;
2.5.2. 实现流程
2.5.3. 代码
2.5.3.1. tryLock
尝试创建 /lock 节点,如果创建成功获得锁
尾声
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《2017-2021字节跳动Android面试历年真题解析》
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-KhAJPGAD-1715228489948)]
《2017-2021字节跳动Android面试历年真题解析》
[外链图片转存中…(img-EH7xHK6y-1715228489948)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!