博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Grails中service的线程安全的小例子
阅读量:4617 次
发布时间:2019-06-09

本文共 1189 字,大约阅读时间需要 3 分钟。

不小心弄出一个线程不安全的Service
class ExcelImpService extends AbstractExcelImporter {
ExcelImportService excelImportService
List<Map> imp(FileStore excelFileStore, Map config) {
String excelPath = excelFileStore.path
assert new File(excelPath).exists()
this.
read(excelPath)
println workbook.getSheetName(0)
println workbook.getSheetName(0) //停一下
excelImportService.columns(workbook, config)
}
}
因为默认依赖注入的service是单实例的,所以会出现下面的结果
---sout---
浏览器1:company
浏览器2:expenseGroup
浏览器2:expenseGroup
浏览器1:expenseGroup (属性对象被别的线程修改了,应该还是company才对)
这个问题还是很隐晦的,而且线程安全问题一般不容易测试,所以要尽量从理论上消灭在萌芽状态
public abstract class AbstractExcelImporter extends imexporter.AbstractImexporter {
Workbook
workbook= null //
这个继承过来的属性就是隐患,每次调用read方法,都会修改之
...略...
}
经验:service如果有属性,要么搞成final的,否则就要格外留意方法中对其修改的操作。
解决办法:
开始想把ExcelImpService改成一个普通类,但是不利于获得其它service的支持(excelImportService)。。。
把service声明为session或request级别的,体验一下基于使用条件的线程安全。
/**
* default(singleton) is NOT thread safe, since extends workbook prototype from AbstractExcelImporter
* request -- 同一浏览器的同一tab是线程安全的
* session -- 不同(厂商)浏览器间是线程安全的,同一浏览器的不同tab是不安全的(但一般没人那么无聊吧,所以这就够了)
*/
static scope = 'session' 

转载于:https://www.cnblogs.com/shhaoran/archive/2013/02/05/2924518.html

你可能感兴趣的文章
JS写入Json到CSV并下载
查看>>
Python2.3-原理之语句和语法
查看>>
RecyclerView实现底部载入很多其它功能
查看>>
【大话设计模式】——简单工厂模式
查看>>
如何安全地关闭MySQL实例
查看>>
Redis Cluster 3.0搭建与使用
查看>>
python基础学习第一波
查看>>
寻找最接近输入的单词的一个方法
查看>>
openlayers基础用例
查看>>
基础储备—字面量,符号引用,直接引用
查看>>
android的线性布局
查看>>
jQuery对象复制
查看>>
I/O空间映射
查看>>
java的reflection和introspector
查看>>
在win7电脑中如何查看运行进程的PID标识符
查看>>
[Vue] vue-cli3.0安装
查看>>
Struts2(十五)实现文件上传
查看>>
推荐几个精致的web UI框架
查看>>
Linux学习书目
查看>>
发现一个animate的小应用
查看>>