spring aop 异常处理 Java后端1年经验和技术总结(2)

电脑杂谈  发布时间:2018-02-02 12:07:51  来源:网络整理

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对象,常用语异步操作,建议使用匿名内部类,方便阅读和使用。

spring异常处理机制_spring aop 异常处理_spring的aop的异常处理

额外需要说明的是:

理解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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 库西塔尔吐尔达力
      库西塔尔吐尔达力

      国家就是该好好收拾日本鬼子的产业

    • 谢艳丽
      谢艳丽

      我们是有了里子

    热点图片
    拼命载入中...