最近有一个开发的需求须要从服务器下载相关的照片凭证文件,服务器中须要先下载压缩打包后供客户下载。数据库
逻辑思路是:服务器
1.获取数据库中凭证的url多线程
2.在服务器上根据对应的url下载图片,写入指定的文件夹(临时建立)并发
3.压缩整个文件夹并经过response返回给用户性能
4.删除临时建立文件和文件夹优化
5.overthis
(说明:指定的文件夹是临时建立的,不一样的用户建立的文件夹名字一致。)url
-----------------------------------------------解决思路------------------------------------------------------------------ spa
从需求中就能够看出代码涉及了服务器上同一个文件夹的写操做,若是多个用户在差很少时刻点击打包按钮,那么有可能会产生冲突,须要进行多线程同步操做。你们都知道SpringMVC 的controller默认是单例模式,所以在controller中进行代码同步操做是没有问题的。线程
第一次是直接在controller的对应方法中加入了synchronized关键字。显然这种作法是很是不负责任的,由于在controller中也会涉及数据库的读操做,这些操做是能够并发执行的。可是synchronized关键字会将整个controller方法变成同步方法,不一样的线程须要排队执行,下降了并发效率。
最好的方法是在相关的文件写操做的地方进行
synchronized(this){
//FileIO operation
}
这就是细化同步代码块的粒度,减少原子大小,尽量发挥线程并发的优点。
ps:其实能够经过每一个线程建立惟一目录的形式去解决多线程冲突问题性能还更好,算是能够优化的地方吧,可是应用并发量小就不作考虑了。今天发现了问题作了一个记录^_^