3.1.1 线程安全问题
代码中如果有同步操作,共享变量要特别注意(这个一般都能意识到)
多个操作能修改数据表中同一条数据的。(这个容易被忽略,业务A可能操作表a,业务B也可以操作表a,业务A、B即使在不同的模块和方法中,也会引起线程安全问题。例如如果一个人访问业务A接口,另一个人访问业务B接口,在web中每个业务请求都是会有单独的一个线程进行处理的,就会出现线程安全问题)。
不安全的类型使用,例如StringBuffer、StringBuild,HashTable、HashMap等。在工作中我就遇到过有人在for循环进行list的remove,虽然编译器不报错,程序可以运行,但是结果却可想而知。
Spring的bean默认是单例的,如果有类变量就要特别小心了(一般情况下是没人在控制层、业务层、DAO层等用类变量的,用的话建议是final类型,例如日志log,gson等)。
多个系统共享情况,这个其实和分布式系统类似
用户重复提交问题(即使代码中从读取是否存在进行限制不能解决问题)
3.1.2 线程安全解决
在需要同步的地方采用安全的类型。spring aop 异常处理
JDK锁机制,lock、tryLock,synchronized,wait、notify、notifyAll等
Concurrent并发工具包,在处理一些问题上,谁用谁知道。强烈建议查看源码!
数据表加锁。(除非某个表的访问频率极低,否则不建议使用)
涉及分布式的,采用中间件技术例如zookeeper等解决。
3.2 异步
异步使用场景不影响主线程,且响应较慢的业务。例如IO操作,第三方服务(短信验证码、app推送、云存储上传等)。
如果异步任务很多,就需要使用任务队列了,任务队列可以在代码级别实现,也可以利用redis(优势太明显了)。
3.3 多线程通信
这方面文章非常多,这里不在详述。
共享变量方式(共享文件、全局变量,信号量机制等)
消息队列方式
忙等,锁机制
3.4多线程实现
集成Thread类,重写(这里的重写指的是override)run方法,调用start方法执行。
实现Runable接口,实现run方法,以Runable实例创建thread对象。
实现Callable接口,实现call方法,FutureTask包装callable接口,FutureTask对象创建thread对象,常用语异步操作,建议使用匿名内部类,方便阅读和使用。

额外需要说明的是:
理解thread的join方法;
不要认为volitate是线程安全的(不明白原因的建议去看jvm运行时刻内存分配策略);
sleep时间片结束后并不保证立马获取cpu。
ThreadLocal能够为每一个线程维护变量副本,常用于在多线程中用空间换时间。
4. 开源框架4.1 Hibernate、Mybatis
相信每一个java程序员对这些都不陌生,这里不再详述。
需要说明的主要以下几点:
hibernate一级缓存(内置session缓存),二级缓存(可装配sessionFactory缓存),二级缓存会引起并发问题。
hibernate延迟加载原理理解。
hibernate 的get、load方法,sava、persist、savaOrUpdate方法区别
session重建了关联关系却并没有同进行同步和更新 5.hibernate session关联关系:detached对象、persistent对象
Spring data集成,注解方式配置属性和实体。
mybatis 插件。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-64566-2.html
我们是有了里子
国家就是该好好收拾日本鬼子的产业