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