线程同步问题基础(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 会将其分配给线程池中的线程:
- 如果线程池中有空闲线程,Tomcat 会将请求分配给该线程进行处理。
- 如果没有空闲线程且线程池未达到最大线程数,Tomcat 会创建一个新线程来处理该请求。
- 如果线程池已满且没有空闲线程,Tomcat 会将请求排队等待,直到有线程处理完成。
- 当线程池有空闲线程时,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
