线程同步问题基础(synchronized)

线程同步问题

synchronized 关键字(排它锁/互斥锁)

synchronized 关键字用于实现线程同步,但它并不灵活,只有在代码块执行完毕时才会释放锁。

java
复制代码
synchronized(锁对象) { // 执行内容,临界区代码 }

锁是争用对象,也可以理解为临界资源的门。多个线程会争用锁,只有获得锁的线程才能进入临界区并执行加锁的内容。

锁的粒度临界区代码的长短锁对象的选择共同决定。

只有访问临界资源时,线程才会争抢锁。

具体来说:

  • 临界区代码的长短决定了锁的粒度范围

  • 锁对象决定了线程同步的竞争条件

    • 竞争条件决定了哪些线程应互斥执行,哪些可以并发执行。即:争夺相同锁的线程必须互斥执行,而争夺不同锁的线程可以并发执行。

    • 例如:通过对 userId 的常量池引用加锁(因为相同的字符串只有一个常量池引用),使得相同 userId 执行该段代码时会互斥执行,不同 userId 则可以并发执行。这样就可以实现并发场景下每个用户的提交操作互不干扰。

      java
      复制代码
      synchronized (String.valueOf(userId).intern()) { return questionSubmitService.doQuestionSubmitInner(userId, questionId); }

      tomcat本身就是并发的

Tomcat 服务器

Tomcat 内部使用线程池来管理并发请求的处理,Spring Boot 内置的 Tomcat 可以通过一些配置来控制线程池的大小。

默认配置示例如下:

yml
复制代码
server: tomcat: max-threads: 200 # 最大线程数 min-spare-threads: 25 # 最小空闲线程数 accept-count: 100 # 请求队列的最大长度 max-connections: 10000 # 最大连接数

当请求到达 Tomcat 时,Tomcat 会将其分配给线程池中的线程:

  1. 如果线程池中有空闲线程,Tomcat 会将请求分配给该线程进行处理。
  2. 如果没有空闲线程且线程池未达到最大线程数,Tomcat 会创建一个新线程来处理该请求。
  3. 如果线程池已满且没有空闲线程,Tomcat 会将请求排队等待,直到有线程处理完成。
  4. 当线程池有空闲线程时,Tomcat 会继续接收并处理新的请求。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
纸鸢花夏
作者分享
打卡: 1. 力扣*3 2. oj项目第四期 3. sql学习 sql查询中各操作的执行顺序,符合直觉的,from,on,where,group by,聚合函数,having,select,distinct,order by,limit 朴素思想,先过滤再操作,order by最好有索引
1
打卡: 1. 二叉树算法题收尾,力扣面试经典题单*5,力扣每日一题 2. mybatis复习 3. spring基础 。。。。。怎么一整理发现一天好像什么都没做
3
打卡: 1. 几道树相关的算法题 2. oj项目第三期和第四期的一部分,判题模块开发那部分真的很硬核难懂呢
1
今日打卡: 1. synchronized关键字线程同步 2. aop用法用处,切面的创建和使用,注解的创建和使用 3. 基本使用stream流+lambda表达式 4. 几道树相关算法题 没做几件事,但人又觉得好累,只想go to bed,明天真该去运动运动了
3
序列化反序列化问题 无论是前端还是后端,在发送和接收数据时,通常都需要进行序列化。这个过程有时是自动完成的,例如,前端通过 axios 发起请求时,会自动将数据序列化后发送;而后端则通过自动绑定机制(如 @RequestBody 注解)实现数据的反序列化。后端使用 @RestController 注解时,会自动将响应对象序列化为 JSON 格式,再发送给客户端。 JSON 作为一种常用的数据交换格式,本质上是基于文本的字符串格式,用于表示结构化的数据。它充当了不同系统或模块间数据传输的媒介,并在序列化和反序列化过程中起到桥梁作用,使得数据能够在不同平台、编程语言之间进行传递。 常用库: gson,jackson 今日: 1. oj项目第二期 2. 二叉树相关算法题(基础复习) 3. 沉淀基础技术 每天都在怠懈,恨自己不能努力多些
4
下载 APP