5、线程与并发

简介: synchronized基于Monitor实现,通过CAS设置owner实现加锁,支持锁升级(偏向→轻量级→重量级)。Java 6起优化性能,15后废弃偏向锁。相比volatile仅保证可见有序,synchronized还保证原子性;相较Lock,其为关键字,自动释放锁,但功能较简单。

5.3 synchronized 原理
以重量级锁为例,比如 T0、T1两个线程同时执行加锁代码,已经出现了竞争(代码如下)
Plain Text
1synchronized(obj){//加锁
2
3}// 解锁
1.当执行到行1的代码时,会根据 obj的对象头找到或创建此对象对应的 Monitor 对象(C++对象)2.检查 Monitor 对象的 owner 属性,用 Cas 操作去设置 owner 为当前线程,Cas 是原子操作,只能有一个线程能成功
a.假设 T0 Cas 成功,那么 T0 就加锁成功,可以继续执行 synchronized 代码块内的部分b.T1 这边 Cas 失败,会自旋若干次,重新尝试加锁,如果
i.重试过程中 T0 释放了锁,则T1 不必阻塞,加锁成功
ii.重试时 T0 仍持有锁,则T1 会进入 Monitor 的等待队列阻塞,将来 T0 解锁后会唤醒它恢复运行(去重新抢锁)
5.4【追问】synchronized 锁升级
synchronized 锁有三个级别:偏向锁、轻量级锁、重量级锁,性能从左到右逐渐降低如果就一个线程对同一对象加锁,此时就用偏向锁
又来一个线程,与前一个线程交替为对象加锁,但只是交替,没有竞争,此时要升级为轻量级锁如果多个线程加锁时发生了竞争,必须升级为重量级锁
【说明】
·自java 6 开始对 synchronized 提供了锁升级功能,之前只有重量级锁但从java 15 开始,偏向锁被标记为已废弃,将来会移除(因为实际带来的性能提升不明显,某些情况下反而影向性能)
5.5 对比synchronized 和 volatile
并发编程需要从三个方面考虑线程安全,分别是:原子性、可见性、有序性·volatile 修饰共享变量,可以保证它的可见性和有序性,但不能保证原子性(JMM模型)·synchronized 代码块,不仅能保证共享变量的可见性、有序性,同时也能保证原子性PS.
,实际上用 volatie 去保证可见性和有序性,并不像上面那一句话描述的那么简单,可以参考黑马课程
5.6 对比 synchronized 和Lock
synchronized 是关键字,Lock 是Java 接
前者底层是 C++代码实现锁,后者是 Java 自己的代码来实现锁
·Lock 功能更多,比如可以选择是公平锁还是非公平锁、可以设置加锁超时时间、可打断等·Lock 的提供多种扩展实现(例如读写锁),可以根据场景选择更合适的实现
。Lock 释放锁需要调用 unlock 方法,而 synchronzied 在代码块结束无需显式调用就可以释放锁

相关文章
|
1天前
|
缓存 负载均衡 安全
第十章 常用组件1、nginx相关
正向代理是客户端通过代理访问外部服务器,隐藏客户端身份,用于访问受限资源或保护隐私;反向代理则是服务器前的代理,接收客户端请求并转发至内部服务器,隐藏真实服务器,实现负载均衡、安全防护与缓存加速,提升系统性能与安全性。
|
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天前
|
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),依赖数据特征。实际应用中常结合多种算法优化性能。