单、业务的解耦,看得我是非常佩服。我想很多面试中都会问道单例模式吧,还没有理解
的建议去看一看。
%
3.多线程
3.1 线程安全
这个是老生常谈的问题了,但是确实是问题和 bug 高发区。线程同步问题不需要单独
写了,想必大家都清楚,不太熟悉的建议百度一下。
3.1.1线程安全问题
1.代码中如果有同步操作,共享变量要特别注意(这个一般都能意识到)
2 多个操作能修改数据表中同一条数据的。(这个容易被忽略,业务 A 可能操作表
a,业务 B 也可以操作表 a,业务 A、B 即使在不同的模块和方法中,也会引起线程安全问
题。例如如果一个人访问业务 A 接口,另一个人访问业务 B 接口,在 web 中每个业务请
求都是会有单独的一个线程进行处理的,就会出现线程安全问题)。
3.不安全的类型使用,例如 StringBuer、StringBuild,HashTable、HashMap
等。在工作中我就遇到过有人在 for 循环进行 list 的 remove,虽然编译器不报错,程序
可以运行,但是结果却可想而知。
4.Spring 的 bean 默认是单例的,如果有类变量就要特别小心了(一般情况下是没人
在控制层、业务层、DAO 层等用类变量的,用的话建议是 nal 类型,例如日志
log,gson 等)。
5.多个系统共享数据库情况,这个其实和分布式系统类似
用户重复提交问题(即使代码中从数据库读取是否存在进行限制不能解决问题)
3.1.2 线程安全解决
在需要同步的地方采用安全的类型。
JDK 锁机制,lock、tryLock,synchronized,wait、notify、notifyAll 等
Concurrent 并发工具包,在处理一些问题上,谁用谁知道。强烈建议查看源码!
数据表加锁。(除非某个表的访问频率极低,否则不建议使用)
涉及分布式的,采用中间件技术例如 zookeeper 等解决。
3.2 异步
异步使用场景不影响主线程,且响应较慢的业务。例如 IO 操作,第三方服务(短信验
证码、app 推送、云存储上传等)。
评论0
最新资源