19.Spring如何处理线程并发问题?

这篇具有很好参考价值的文章主要介绍了19.Spring如何处理线程并发问题?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring如何处理线程并发问题?

  • 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。

  • ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。

  • ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。文章来源地址https://www.toymoban.com/news/detail-755446.html

1
2 /***
6 * 单例Bean的情况
7 * 如果在类中声明成员变量 并且有读写操作(有状态),就是线程不安全
8 * 解决:
9 * 1.设置为多例
10 * 2.将成员变量放在ThreadLocal
11 * 3.同步锁 会影响服务器吞吐量
12 * 但是!
13 * 只需要把成员变量声明在方法中(无状态), 单例Bean是线程安全的
14 */
15 public class Run {
16 public static void main(String[] args) {
17
18
19  AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
20
21 // 线程一
22  UserService bean = applicationContext.getBean(UserService.class);
23 new Thread(()> {
24  System.out.println(bean.welcome("张三"));
25 }).start();
26
27 // 线程二
28  UserService bean2 = applicationContext.getBean(UserService.class);
29 new Thread(()> {
30  System.out.println(bean2.welcome("李四"));
31 }).start();
32
33 }

到了这里,关于19.Spring如何处理线程并发问题?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring(19) ThreadPoolTaskExecutor 线程池的使用

    1.1 为什么使用线程池 降低系统资源消耗: 通过重用已存在的线程,降低线程创建和销毁造成的消耗; 提高系统响应速度: 当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; 方便线程并发数的管控: 因为线程若是无限制的创建,可能会导致内

    2024年01月19日
    浏览(37)
  • Java面试_并发编程_线程基础

    进程是正在运行程序的实例, 进程中包含了线程, 每个线程执行不同的任务 不同的进程使用不同的内存空间, 在当前进程下的所有线程可以共享内存空间 线程更轻量, 线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程) 并发是单个

    2024年02月07日
    浏览(54)
  • Java -并发(多线程)-Interview面试题收集

      1)多线程中 synchronized 锁升级的原理是什么? synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以

    2024年02月06日
    浏览(59)
  • 第二章--Java多线程高并发+面试题

    s1 基础知识 001 并发编程的优缺点 优点 充分利用多核cpu的计算能力 方便业务拆分,提升系统并发能力和性能,提升程序执行效率,提速 缺点 内存泄漏 | 上下文切换 线程安全 | 死锁 002 并发编程三要素 三要素 安全问题的原因 具体原因 对策 原子性 线程切换 一个或多个操作要么

    2024年02月06日
    浏览(65)
  • java八股文面试[多线程]——并发三大特性 原子 可见 顺序

        AutomicInteger :  volatile + CAS 总线LOCK  MESI 两个协议 TODO volatile的可见性和禁止重排序是怎么实现的: DCL场景:  new操作会在字节码层面生成两个步骤: 分配内存、调用构造器 然后把引用赋值给singleton 不加volatile则会发生指令重排,可能得到不完整的对象 知识来源: 【并

    2024年02月11日
    浏览(53)
  • 多线程和并发问题详解

    进程 :是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程 :是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的 资源。 虽然系统是把资源分给进程,但是CPU很特殊,是被分配到线程的,所以线程是CPU分配的

    2024年02月06日
    浏览(43)
  • ai对话---多线程并发处理问题

    ai对话—多线程并发处理问题 先简单回顾一下旧版本的对话接口如何实现 其实这里更多是涉及到多线程工作上的学习问题 在初代版本中 我自己以为的搞了一个线程池就能完成多线程的任务了 Java public ThreadPoolExecutor pool=new ThreadPoolExecutor(13,13,8, TimeUnit. MINUTES ,new ArrayBlockingQue

    2024年02月20日
    浏览(29)
  • 最新整理Spring面试题2023

    有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 先介绍Spring是怎么来的,发展中有哪些核心的节点,当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本对应的时间节点了。

    2023年04月22日
    浏览(41)
  • FunASR语音识别(解决-高并发线程问题)

    在我的另一个博客有介绍FunASR,并且进行了语者分离,不过最近FunASR自带了语者分离,挺好挺好,但是一直看社区就是大家都用python写,会出现线程不安全问题,群里有大佬说使用多台服务器,然后用nginx做代理,这不是妥妥土豪行为吗,感觉很浪费 vad出现的问题 方案解决:

    2024年01月16日
    浏览(42)
  • 【并发编程】多线程安全问题,如何避免死锁

    从今天开始阿Q将陆续更新 java并发编程专栏 ,期待您的订阅。 在系统学习线程之前,我们先来了解一下它的概念,与经常提到的进程做个对比,方便记忆。 线程和进程是操作系统中的两个重要概念,它们都代表了程序运行时的执行单位,它们的出现是为了更好地管理计算机

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包