controller层共享变量的并发问题。

StopTWorld 发布于 2017/10/23 10:27
阅读 728
收藏 1

某个业务需要限制当天的运行次数,一天这个业务触发不能超过三次,并发情况下怎么控制, springMVC  控制层 方法,加一个静态变量控制次数,这里是不是需要加锁呀?  感觉最近看了并发,思路很乱,又有说什么servlet是线程安全的。。。  请大佬指点、

加载中
1
DeMoNHaDeS
DeMoNHaDeS

数据库控制吧。数据库记录次数,每天清零,同时利用数据库锁防止程序并发超次数

StopTWorld
StopTWorld
好的,谢谢 这是一个思路
0
风吹屁屁凉
风吹屁屁凉

这样不合适吧,用缓存好一些,使用静态变量你服务器重启或者挂了怎么办,变量不又还原了

风吹屁屁凉
风吹屁屁凉
回复 @StopTWorld : 使用synchronized块,如synchronized(name){逻辑处理}
StopTWorld
StopTWorld
确实这个是一方面,这是进阶问题(后续讨论)。 首先假如用静态变量的话,多人执行这一业务,在数量控制上是不是要加锁?加锁的话 要用什么方式?  这个并发和servlet多人访问原理什么关系?  我暂时想知道这几个问题  ~~
0
cafelication
cafelication

静态变量恐怕控制不了把, 还是要缓存+拦截器控制吧

0
yinhex
yinhex

兄弟,你这个必须持久化啊。例如mysql或者redis,或者memcached。

0
flyingsam
flyingsam

第一,如果你系统是单节点的,问题就简单很多了,使用数据库或者redis缓存记录业务数量,控制层加上判断逻辑而且代码需要synchronized包围

第二,如果你的系统是集群的,在第一种基础上在synchronized里面加分布式锁,可以使用redis实现分布式锁

0
bovver
bovver

不用怀疑,共享变量肯定会有并发问题

0
开源中国-首席营养师

显明需要数据库控制

0
JPer
JPer

最好别用synchronized,这样你的并发数会下降,用redis就行,再不行db也可以啊;本地cache不利于分布式和重启的情况。

0
打杂的小二
打杂的小二
guava的rate limiter
0
StopTWorld
StopTWorld

谢谢各位哈~ 有思路了

 

返回顶部
顶部