
不管有多少任务调用写日志功能,都必须始终使用同一个线程来处理这些写日志操作,以保证不占用过多的线程资源和避免新建线程带来的延迟。java线程之间的通信总是隐式进行 java并发模型—硬件视图 内存空间 共享对象 共享对象 共享对象 内存中的jvm 对象 程之间共享 线程1 线程2 处理器a 处理器b 处理器c 处理器d java并发模型—操作系统视图 jvm进程 hotspot vm中, java线程被 java线程 java线程 java线程 映射为本地操作系 统线程 linux kernel 操作系统内核 直接调度java 线程给可用的cpu处理器a 处理器b 处理器c 处理器d 编译器和处理器喜欢不择手段的冒险源代码 编译器优化 指令级并行 内存系统的 最终执行的 的重排序 的重排序 重排序 指令序列 编译器的 重排序 重排序 指令级并行的 处理器的 重排序 重排序 内存系统的 重排序 顺序一致性内存模型的原型结构 处理器a 处理器b 处理器c 处理器c a3 b2 d1 程序顺 a2 b1 c3 d2 序不变 a1 c2 每个内存 c1 单元一个 fifo队列内存单元 1 2 3 4 5 6 7 8 9 10 11 12 13 … … n顺序一致性内存模型的程序员视图 线程 线程 线程 线程 … 2 3 n 1 内存 顺序一致性内存模型的2 大特性 特性2 线程a 的程序顺序 操作的执行整体上无序,但两个线程 都只能看到这个执行顺序。如果是多线程在一个会话上发送命令(比如获取(top或者retr)、删除(dele))操作服务器,这些命令的操作都不是线程安全的,这样很可能出现outputstream和inputstream数据不匹配而相互打架的情况,这个很可能就是我们看到的日志里有乱码的原因。
4.spring 配置扫描切面,开启@AspectJ注解的支持
<!-- 启动对@AspectJ注解的支持 --><aop:aspectj-autoproxy/><!-- 扫描切点类组件 --><context:component-scan base-package="com.myron.ims.aop" /><context:component-scan base-package="com.myron.ims.service"/><bean><property value="5" /><property value="10" /><property value="true" /></bean>
5.使用范例LoginController方法中添加日志注解
/***系统登入*/@RequestMapping("/login.do")@SystemControllerLog(description="登入系统")@ResponseBodypublic Map<String, Object> login(String username, String password, Boolean rememberMe, HttpServletRequest req){//业务代码省略...}/*** 安全退出登入* @return*/@SystemControllerLog(description="安全退出系统")@RequestMapping("logout.do")public String logout(){Subject subject=SecurityUtils.getSubject();if(subject.isAuthenticated()){subject.logout(); // session 会销毁,在SessionListenersession销毁,清理权限缓存}return "/login.jsp";}
6.运行效果
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-97205-2.html
#给烊烊520#1128生日评论集体向520万刷起来#护千玺到远方##易烊千玺真的很不错#
我喜欢他们这种