当前位置: 首页 > news >正文

Java并发迷宫:同步的魔法与死锁的诅咒

在Java编程的宇宙中,有一个充满神秘与挑战的维度——并发编程。它如同一座错综复杂的迷宫,每个角落都潜藏着惊喜与陷阱。在这篇博客里,我们将一起探索这座迷宫的深处,揭开同步的魔法与死锁的诅咒。

第一章:同步魔法的诞生

同步,是并发编程中最基础也是最重要的概念之一。它就像是一座桥梁,连接着多个线程的世界,确保数据的一致性和完整性。在Java中,synchronized关键字是最常见的同步魔法,它能将普通的方法或者代码块变成一把锁,保护共享资源免受多线程的侵扰。

示例代码:

public class MagicCounter {private int count = 0;public synchronized void increment() {// 这里是一个临界区,每次只允许一个线程进入count++;}public synchronized int getCount() {// 同步读取count的值,确保数据一致性return count;}
}
第二章:死锁的诅咒

然而,同步魔法虽强,但若使用不当,便会招致死锁的诅咒。死锁是一种极端情况,发生在两个或多个线程无限期地等待彼此持有的资源释放,导致整个系统陷入僵局。

死锁示例:

class KeyA {synchronized void useKeyB(KeyB b) {System.out.println("KeyA trying to use KeyB");try { Thread.sleep(100); } catch (InterruptedException e) {}b.useKeyA(this);}
}class KeyB {synchronized void useKeyA(KeyA a) {System.out.println("KeyB trying to use KeyA");try { Thread.sleep(100); } catch (InterruptedException e) {}a.useKeyB(this);}
}

在这个例子中,两个线程分别持有了KeyAKeyB的锁,并试图获取对方的锁。由于它们都无法释放自己持有的锁,因此陷入了死锁。

第三章:解锁同步的智慧

要避免死锁的诅咒,我们需要掌握更高级的同步技巧。在Java中,java.util.concurrent包提供了多种工具,如ReentrantLockSemaphoreCondition,它们提供了比synchronized更精细的控制能力。

ReentrantLock示例:

import java.util.concurrent.locks.ReentrantLock;public class SmartCounter {private final ReentrantLock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public int getCount() {lock.lock();try {return count;} finally {lock.unlock();}}
}

ReentrantLock不仅提供了可中断的锁获取,还允许公平锁和非公平锁的选择,使得同步策略更加灵活。

第四章:条件变量与信号量的魅力

除了锁之外,Java还提供了条件变量(Condition)和信号量(Semaphore),它们能够实现更复杂的同步模式。条件变量允许线程在特定条件下等待,而信号量则用于控制对一组相关资源的访问。

Semaphore示例:

import java.util.concurrent.Semaphore;public class SemaphoreExample {private static final Semaphore semaphore = new Semaphore(5);public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getName() + " is accessing a resource.");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}).start();}}
}

在这个例子中,信号量限制了同时访问资源的线程数量,有效地避免了资源争抢。

相关文章:

Java并发迷宫:同步的魔法与死锁的诅咒

在Java编程的宇宙中&#xff0c;有一个充满神秘与挑战的维度——并发编程。它如同一座错综复杂的迷宫&#xff0c;每个角落都潜藏着惊喜与陷阱。在这篇博客里&#xff0c;我们将一起探索这座迷宫的深处&#xff0c;揭开同步的魔法与死锁的诅咒。 第一章&#xff1a;同步魔法的…...

CoderGuide

CoderGuide是一个针对同学们前后端求职面试的开源项目&#xff0c;作为一名互联网/IT从业人员&#xff0c;经常需要搜索一些书籍、面试题等资源&#xff0c;在这个过程中踩过很多坑、浪费过很多时间。欢迎大家 Watch、Star&#xff0c;供各位同学免费使用&#xff0c;永不收费&…...

链式二叉树

链式二叉树&#xff0c;也称为二叉链表&#xff0c;是数据结构中一种非常重要的树形结构表示方法。在链式二叉树中&#xff0c;每个节点不仅包含数据域&#xff0c;还包含两个指针域&#xff0c;分别指向其左子节点和右子节点。这种结构允许二叉树动态地增长和缩减&#xff0c;…...

PHP高校迎新系统-计算机毕业设计源码08468

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套高校迎新系统。系统通过信息技术的应用&#xff0c;集成了首页、交流论坛、通知公…...

泛微开发修炼之旅--41Ecology基于触发器实现增量数据同步(人员、部门、岗位、人员关系表、人岗关系表)

一、需求背景 我们在项目上遇到一个需求&#xff0c;需要将组织机构数据&#xff08;包含人员信息、部门信息、分部信息、人岗关系&#xff09;生成的增量数据&#xff0c;实时同步到三方的系统中&#xff0c;三方要求&#xff0c;只需要增量数据即可。 那么基于ecology系统&a…...

FVM安装及配置

一、下载fvm 包 git&#xff1a;Release fvm 3.1.7 leoafarias/fvm GitHub 解压到本地文件夹&#xff0c;然后添加环境变量 管理员模式打开cmd&#xff0c;查看是否成功 fvm --version 二、安装Dart SDK 下载Dart SDK&#xff1a;Dart for Windows 三、安装GIT 四、指定…...

[Git][认识Git]详细讲解

目录 1.什么是仓库&#xff1f;2.认识工作区、暂存区、版本库3.认识 .git1.index2.HEAD && master3.objects4.总结 1.什么是仓库&#xff1f; 仓库&#xff1a;进⾏版本控制的⼀个⽂件⽬录 2.认识工作区、暂存区、版本库 工作区&#xff1a;在电脑上写代码或⽂件的⽬录…...

Win11系统Docker部署Blazor程序

1. 开发环境 Windows 11 家庭版&#xff0c;默认支持WSL2 2. Docker安装 安装Docker Desktop需要启用Win11的Linux子系统和虚拟机。以管理员身份运行命令行程序&#xff0c;执行如下命令&#xff1a; 启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-featur…...

C语言自定义类型结构体与位段超详解

文章目录 1. 结构体类型的声明1. 1 结构体声明1. 2 结构体变量的创建和初始化1. 3 结构体的特殊声明1. 3 结构体的自引用 2. 结构体内存对齐2. 1 对齐规则2. 2 为什么存在内存对齐2. 3 修改默认对齐数 3. 结构体传参4. 结构体实现位段4. 1 什么是位段4. 2 位段成员的内存分配4.…...

JS中关于预编译的【关键知识点】总结

在JavaScript中&#xff0c;预编译&#xff08;hoisting&#xff09;是指在代码执行之前&#xff0c;JavaScript引擎会首先对代码进行扫描&#xff0c;将所有的变量声明和函数声明提升到代码的最顶部。这一过程使得我们在代码中可以在声明之前使用变量和函数。理解预编译对于深…...

Elasticsearch 映射(mapping)

概念 在 Elasticsearch 中&#xff0c;映射&#xff08;Mapping&#xff09;定义了索引中字段的类型和属性。它是索引数据结构的基础&#xff0c;类似于传统数据库中的表结构定义。映射不仅定义了字段的类型&#xff08;如 ​text​、​keyword​、​integer​ 等&#xff09;…...

开放式耳机更适合运动的时候使用?开放式耳机推荐指南

开放式耳机确实非常适合运动时使用&#xff0c;原因主要有以下几点。 首先&#xff0c;保持对外界的感知是很重要的一点。在运动的时候&#xff0c;我们需要听到周围的环境声音&#xff0c;比如车辆的行驶声、行人的呼喊等&#xff0c;以便及时做出反应&#xff0c;保证自身安全…...

食堂窗口自助点餐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;店铺信息管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…...

请说出路由传参和获取参数的三种方式

在Vue.js中使用Vue Router进行路由管理时&#xff0c;传递和获取参数是常见的需求。这里介绍三种主要的路由传参和获取参数的方式&#xff1a; 1. 通过URL的查询参数&#xff08;Query Parameters&#xff09; 传递参数&#xff1a; 当你需要传递一些非敏感数据&#xff08;…...

精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用

一、区域未停留AI检测算法概述 随着人工智能和计算机视觉技术的飞速发展&#xff0c;区域未停留AI检测算法作为一种重要的视频分析技术&#xff0c;逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据&#xff0c;能够实时分析并判断目标对象是否在预设区域内有足够的…...

html+css練習:iconfont使用

1.網址地址&#xff1a;https://www.iconfont.cn/search/index 2.註冊登錄&#xff0c;將需要的圖標添加到購物車 3.下載代碼 4.下載后的代碼有一個html頁面&#xff0c;裡面有詳細的使用方式...

算法导论 总结索引 | 第五部分 第二十一章:用于不相交集合的数据结构

一些应用涉及 将n个不同的元素分成一组不相交的集合。寻找包含给定元素的唯一集合 和 合并两个集合 1、不相交集合的操作 1、一个不相交集合 数据结构 维持了 一个不相交动态集的集合 S {S_1, S_2,…, S_n}。用一个代表 来标识每个集合&#xff0c;它是这个集合的某个成员。…...

【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)

文章目录 深入理解单例设计模式&#xff1a;原理、实现与最佳实践引言第一部分&#xff1a;设计模式简介第二部分&#xff1a;单例模式定义第三部分&#xff1a;单例模式的优点和缺点第四部分&#xff1a;单例模式的实现方式懒汉式非线程安全的实现线程安全的实现&#xff08;双…...

VTK8.2.0编译(Qt 5.14.2+VS2017)

VTK8.2.0编译&#xff08;Qt 5.14.2VS2017&#xff09; 关于Qt和MSVC的安装&#xff0c;可以参考文章&#xff08;QtMSVC2017&#xff09;。 本篇VTK在QtMSVC的配置下的编译。VTK 以8.2.0为例。 一、环境变量的配置 我们打开电脑的环境变量&#xff0c;可以看到没有Qt相关的…...

武汉流星汇聚:亚马逊跨境电商龙头,市场份额稳固,服务品质卓越

在全球跨境电商的版图上&#xff0c;亚马逊无疑是一颗璀璨的明星&#xff0c;以其庞大的市场规模、卓越的用户体验和强大的品牌影响力&#xff0c;稳居行业龙头地位。即便在诸多新兴跨境平台竞相崛起的背景下&#xff0c;亚马逊依然以其独特的优势&#xff0c;保持着难以撼动的…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...