5、线程与并发

简介: ThreadLocal通过线程私有的ThreadLocalMap实现变量隔离,避免多线程竞争。每个线程以ThreadLocal为key存储独立资源,使用后需调用remove()防止内存泄漏。悲观锁(如synchronized)假定竞争频繁,独占资源;乐观锁(如AtomicInteger)假定竞争少,失败则重试,适用于高并发低冲突场景。

5.1 ThreadLocal 的原理
ThreadLocal 的主要目的是用来实现多线程环境下的变量隔离
·【解释】即每个线程自己用自己的资源,这样就不会出现共享,没有共享,就不会有多线程竞争的问题原理
每个线程对象内部有一个 ThreadLocalMap,它用来存储这些需要线程隔离的资源
资源的种类有很多,比如说数据库连接对象、比如说用来判断身份的用户对象.
怎么区分它们呢,就是通过 ThreadLocal,它作为ThreadLocalMap 的 key,而真正要线程隔离的资源作为ThreadLocalMap 的value
ThreadLocal.set 就是把 ThreadLocal 自己作为 key,隔离资源作为值,存入当前线程的ThreadLocalMap
ThreadLocal.get 就是把 ThreadLocal 自己作为 key,到当前线程的 ThreadLocalMap 中去查找隔离资源
。ThreadLocal 一定要记得用完之后调用remove0 清空资源,避免内存泄漏
5.2 解释悲观锁与乐观锁
悲观锁
·像 synchronized,Lock这些都属于悲观锁
如果发生了竞争,失败的线程会进入阻塞
【理解】悲观的名字由来:害怕其他线程来同时修改共享资源,因此用互斥锁让同一时刻只能有一个线程来占用共享资源
乐观锁
·像 Atomiclnteger,AtomicReference 等原子类,这些都属于乐观锁
如果发生了竟争,失败的线程不会阻塞,仍然会重试
【理解】乐观的名字由来:不怕其他线程来同时修改共享资源,事实上它根本不加锁,所有线程都可以去修改共享资源,只不过并发时只有一个线程能成功,其它线程发现自己失败了,就去重试,直至成功适用场景
,如果竞争少,能很快占有共享资源,适合使用乐观锁
如果竞争多,线程对共享资源的独占时间长,适合使用悲观锁PS.
这里讨论 Java 中的悲观锁和乐观锁,其它领域如数据库也有这俩概念,当然思想是类似的

相关文章
|
1天前
|
安全 Java 数据库连接
第五章 spring框架
Spring的IOC(控制反转)将对象创建交给容器管理,避免手动new;DI(依赖注入)则让容器自动注入所需对象。通过@Controller、@Service等注解声明Bean,使用@Autowired或@Resource实现注入。默认单例Bean无并发控制,若无状态则线程安全,否则需自行保证。
|
1天前
|
SQL 监控 关系型数据库
4、SQL性能分析及优化
通过SkyWalking链路追踪可定位慢接口及慢SQL,或开启MySQL慢查询日志(如设置超1秒记录)来识别执行慢的SQL。结合explain分析执行计划,关注key、type、extra等关键指标,判断索引命中与性能瓶颈,避免全表扫描,优化SQL性能。(238字)
|
1天前
|
程序员 API
7、Lambda表达式
Lambda表达式又称匿名函数,语法为(参数)->表达式,本质是函数对象,用于行为参数化,如Stream API、QueryWrapper等场景。相比匿名内部类,Lambda更简洁,需配合函数式接口使用,且在运行时动态生成类,其this指向也与匿名内部类不同。
|
1天前
|
NoSQL Java 数据库连接
第七章 SpringBoot框架
SpringBoot是简化Spring开发的框架,核心功能包括:starter起步依赖简化配置、自动配置实现Bean自动化管理、内嵌Web服务器支持jar包直接运行。常用starter如web、aop、redis等,分为官方与第三方两类,极大提升了开发效率。(238字)
|
1天前
|
Java Spring 容器
Spring Boot配置的优先级?
SpringBoot项目支持多种配置方式,主要包括配置文件(application.properties、.yml、.yaml)和外部配置(如系统属性、命令行参数)。优先级由高到低为:命令行参数 > 系统属性 > .properties > .yml > .yaml。自动配置核心是@SpringBootApplication中的@EnableAutoConfiguration,通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类,并结合@Conditional条件注解按需注入Bean。
|
1天前
|
Java Spring 容器
Spring Bean的作用域如何设置,常见的取值有哪些?
Spring Bean作用域可通过@Scope注解设置,常见有singleton(默认,单例)、prototype(每次创建新实例)、request(每请求一个实例)、session(每会话一个实例)。singleton在容器启动时初始化,可加@Lazy延迟;prototype则每次使用时创建。多数场景使用默认单例模式。
|
1天前
|
JSON 前端开发 Java
SpringMVC的拦截器用过没有?
拦截器常用于登录校验、参数处理、数据脱敏等,通过实现`HandlerInterceptor`接口,并在配置类中注册,限定拦截路径。与过滤器相比,拦截器基于Spring容器,仅拦截Controller请求,而过滤器作用于所有Web资源。异常处理可使用`@RestControllerAdvice`和`@ExceptionHandler`实现全局捕获。常用注解包括`@RequestMapping`、`@RequestBody`、`@RequestParam`、`@PathVariable`、`@ResponseBody`等,简化开发。
|
1天前
|
Java 数据库 数据安全/隐私保护
什么是AOP?
AOP(面向切面编程)是Spring框架的重要特性,用于将日志、事务、权限等公共逻辑抽离,实现模块复用、降低耦合。项目中常用AOP记录操作日志和权限控制,通过自定义@Log注解结合环绕通知,捕获方法执行信息并存入数据库,便于追踪核心业务操作。其底层基于动态代理实现。
|
1天前
|
缓存 Java Spring
聊-聊Spring中bean的循环依赖问题?
Spring通过三级缓存解决循环依赖:一级缓存存放完整单例Bean,二级缓存存放早期半成品Bean,三级缓存存放对象工厂用于创建代理等对象。A依赖B、B依赖A时,先创建A并放入三级缓存,实例化B时通过三级缓存获取A的工厂生成早期引用并放入二级缓存,B完成初始化后注入A,再将B注入A,最终双方都成功创建并放入一级缓存,流程结束清除二级缓存临时对象。
|
1天前
|
搜索推荐 算法 Java
2、排序
排序算法分为比较类和非比较类。比较类包括快排、归并、堆排(平均时间O(n log n))和插入排序(O(n²)),适用于不同数据规模与有序度;非比较类如计数、桶、基数排序,可达到O(n),依赖数据特征。实际应用中常结合多种算法优化性能。