【Java并发】聊聊活锁

2024-01-22 01:28
文章标签 java 并发 聊聊 活锁

本文主要是介绍【Java并发】聊聊活锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在并发编程中,为了保证数据安全性,所以使用锁机制,syn lock cas 等方式保证,但是也从一定程度降低了性能。而除了这个方面,还引入了锁竞争,比如死锁、活锁。

【Java并发】聊聊死锁

避免死锁:避免线程持有锁并等待锁

产生死锁的根本原因就是两个以上线程持有A锁的前提下,继续等待B锁。那么如果在获取B锁的时候,获取失败,直接释放原有的A锁,也可以打破这个局面。

/*** @author qxlx* @date 2024/1/21 21:07*/
public class DemoLock {private Lock lockA = new ReentrantLock();private Lock lockB = new ReentrantLock();public void f() {for ( ;;) {try {lockA.lock();boolean tryLock = lockB.tryLock();if (tryLock) {try {lockB.lock();// 处理业务逻辑} finally {lockB.unlock();  }}} finally {lockA.unlock();}}}public void g() {for ( ;;) {try {lockB.lock();boolean tryLock = lockA.tryLock();if (tryLock) {try {lockA.lock();// 处理业务逻辑} finally {lockA.unlock();}}} finally {lockB.unlock();}}}}

在这里插入图片描述

活锁

上面的代码,其实是存在问题的,极端情况下。线程T1 获取lock1锁的时候,尝试获取lock2锁,但是获取lock2锁失败。线程T1释放lock1锁之前,线程T2持有lock2锁,去获取lock1锁失败。如此,就是我尝试获取了,但是失败,一直获取不到自己想要的锁。也释放自己的锁,让对方获取,但是对方获取不到。互相谦让。

一个直白的案例就是:两个人过独木桥,死锁是 你不让,我也不让。大家僵持。
活锁是:你让,我也让,结果都不过桥。

区别:
死锁是两个线程都会阻塞,不会消耗CPU资源,但是活锁却不是,不断的加锁解锁,尝试获取锁失败,解锁。一直占用CPU资源,从而导致一直执行不下去。
在这里插入图片描述

那么如何解决呢?
其实办法非常简单,就是在尝试获取锁失败的时候,sleep一会,保证两个线程不是同步操作就可以。

boolean tryLock = lockB.tryLock(r.nextLong() % 10, TimeUnit.MILLISECONDS);

这篇关于【Java并发】聊聊活锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631445

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll