Controller是线程安全吗
1.BIO、NIO、AIO的区别
2.Controller是线程安全吗
3.为什么多线程下会有线程安全问题4.volatile为什么没有原子性?5.JVM的四种内存屏障6.synchronized关键字原理7.synchronized 锁升级 锁降级8.自旋锁、阻塞锁、可重入锁使用解析9.线程间实现通信的几种方式10.ThreadPoolExecutor线程池参数设置技巧11.关于线程同步(7种同步方式)12.ThreadLocal可能引起的内存泄露13.乐观锁的一种实现方式——CAS14.AtomicInteger源码解析15.ReentrantLock源码解析1--获得非公平锁与公平锁lock()16.ReentrantLock源码解析2--释放锁unlock()17.ReentrantLock源码解析3--优先响应中断的lockInterruptibly18.ReentrantLock总结19.ArrayBlockingQueue源码解析20.LinkedBlockingQueue源码解析21.Timer / TimerTask 源码解析22.Delay延迟队列controller是线程不安全的,因为controller使用的是单例模式,不同的线程会对数据进行共享,导致数据混乱,没有实现我们想要的结果,除非定义的是常量,那就没有关系.
因为设计成单例模式的话,就不需要处理太多的gc,性能就可能得到提高
@RestController @RequestMapping("notSafe") public class ControllerNotSafeTest { //1、定义num,判断不同线程访问的时候,num的返回结果是否一致 private Integer num=0; /** * 2、定义两个方法 */ @GetMapping("/test") public Integer test(){ System.out.println(++num);
ThreadUtil.sleep(1000000);
//可能在这里报错,导致上述操作回滚 return num; } }
测试结果:用test1和test2线程访问,发现结果是在test1的结果下进行叠加的,当test1报错回滚后,test2依然在test1之前错误的结果上进行计算,所以有安全问题。
1 2
那么如果想让controller变成线程安全,也就是每个线程独享自己的属性,应该怎么处理呢?
方式一:使用多例模式
增加注解:@Scope("prototype")
@RestController @RequestMapping("notSafe") public class ControllerNotSafeTest { //1、定义num,判断不同线程访问的时候,num的返回结果是否一致 private Integer num=0; /** * 2、定义两个方法 */ @GetMapping("/test") public Integer test(){ System.out.println(++num);
ThreadUtil.sleep(1000000); return num; } }
执行结果:用test1和test2线程访问会产生多个实例,达到数据隔离
1 1
方式二:使用threadLocal进行数据的处理
@RestController //修改为多例模式 @Scope("prototype") @RequestMapping("threadLocalSafe") public class ControllerSafeThreadLocalTest { //1、定义threadLocal 线程独享 ThreadLocal<Integer> threadLocal=new ThreadLocal<>(); /** * 2、定义两个方法 */ @GetMapping("/test") public void test(){ threadLocal.set(1);
System.out.println(threadLocal.get());
threadLocal.set(2); ThreadUtil.sleep(1000000); } }
执行结果:用test1和test2线程访问可以操纵自己的threadLocal,从而达到数据隔离
1 1
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)