老师您好,请教一个问题,谢谢

来源:7-3 J.U.C-ForkJoin

慕神8359304

2019-04-06

老师您的课程里说了,Spring默认作用域是单例的,因为IOC管理的bean一般都是一些无状态的bean(如pojo等),所以不会造成线程安全;但是当bean中含有状态标识,即含有static修饰的全局变量,当多线程访问时,就会出现线程安全,这时候我们采取的做法可以是使用Threadlocal(因为Threadlocal其实维护了一个线程局部变量),这样就能保证每个线程使用的是自己的私有变量,从而解决了线程安全。

现在有个场景是我需要进行累加操作, 也就是多线程对这个bean中的一个count进行累加计数,那种情况下就不能使用您说的Threadlocal解决线程安全了,我应该怎么保证线程安全

写回答

2回答

weixin_慕莱坞3264951

2019-05-19

用Atomic包的工具类?AtomicInteger这些?

0
0

Jimin

2019-04-06

你好,感觉我没完全看懂你的实际场景,先按照我的理解给你一个方案,如果不妥你再回复一下。
大致猜测你这应该是一个分布式服务,这时累加操作单独放在一台服务器内存里存储及计算不太合适,因为这时单服务器内如何加锁都无法保证在其他服务器上会更新。
分布式场景做累加,引入一个第三方的中间件就容易很多,比如使用redis去存储,每次只需执行incr就可以了。如果之前没引入redis且最终要更新到数据库,这时可以通过sql执行+1,如果同时有其他字段跟着更新,防止并发更新这时可以引入乐观锁更新(update xxx set count=xxx where id=xxx and count = xxx),在这基础上如果有更复杂的情景,还可以考虑引入分布式锁。

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程