【高级编程】synchronized 解决并发问题 类的线程安全类型
文章目录
- 并发问题
- 同步方法
- 同步代码块
- 线程安全类型
- ArrayList
- Hashtable
- HashMap
- Vector
多线程共享数据引发的问题
模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。
public class Site implements Runnable {int count = 10; // 总票数int num = 0; // 已抢票数@Overridepublic void run() {while (true) {if (count <= 0) {break;}count--;num++;System.out.println(Thread.currentThread().getName() + "抢到第" + num + "张票,剩余" + count + "张票!");//休眠 模拟网络延时try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();
}}}}
public static void main(String[] args) {Site site = new Site();Thread th1 = new Thread(site,"A");Thread th2 = new Thread(site,"B");Thread th3 = new Thread(site,"C");th1.start();th2.start();th3.start();
}
问题
-
不是从第1张票开始
-
存在多人抢到一张票的情况
-
有些票号没有被抢到
-
…
多个线程操作同一共享资源时,将引发数据不安全问题
并发问题
synchronized 在 Java 中是一种悲观锁(Pessimistic Lock)的形式。悲观锁假设最坏的情况,即认为数据总是会被其他线程修改,因此在处理数据之前就先获取锁。这样可以避免数据冲突,但也可能导致较高的竞争开销。
同步方法
使用 synchronized 修饰的方法控制对类成员变量的访问,synchronized 就是为当前的线程声明一把锁
访问修饰符 synchronized 返回类型 方法名(参数列表){……}
synchronized 访问修饰符 返回类型 方法名(参数列表){……}
使用同步方法的网络购票
public class Site implements Runnable{int count = 10; // 总票数int num = 0; // 已抢票数@Overridepublic void run() {while(true){if(qg()){ break; }//休眠 模拟网络延时try {Thread.sleep(500); // 休眠半秒} catch (InterruptedException e) {e.printStackTrace();}}}public synchronized boolean qg(){if(count <= 0){ return true; }count--;num++;System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票!");return false;}}
同步代码块
使用 synchronized 关键字修饰的代码块
synchronized(syncObject){// 需要同步的代码
}
syncObject为需同步的对象,通常为this- 效果与同步方法相同
使用同步代码块的网络购票
public class Site implements Runnable{int count = 10; // 总票数int num = 0; // 已抢票数@Overridepublic void run() {while(true){//同步synchronized (this){if(count <= 0){ break;}count--;num++;System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票!");}//休眠 模拟网络延时try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();
}}}}
多个并发线程访问同一资源的同步代码块时
-
同一时刻只能有一个线程进入同步代码块
-
当一个线程访问一个同步代码块时,其他同步代码块同样被锁定
-
当一个线程访问一个同步代码块时,其他线程可以访问该资源的非同步代码
线程安全类型
为达到安全性和效率的平衡,可以根据实际场景来选择合适的类型
| 方法是否同步 | 效率比较 | 适合场景 | |
|---|---|---|---|
| 线程安全 | 是 | 低 | 多线程并发共享资源 |
| 非线程安全 | 否 | 高 | 单线程 |
| Hashtable | HashMap | |
|---|---|---|
| 继承关系 | 实现了 Map 接口,继承 Dictionary 类 | 实现了 Map 接口,继承 AbstractMap 类 |
| 安全性 | 线程安全,效率较低 | 非线程安全,效率较高 |
| 键值 | 键和值都不允许为 null | 键和值都允许为 null |
| StringBuffer | StringBuilder | |
| 安全性 | 线程安全 | 非线程安全 |
| 适合场景 | 适用于多线程环境中的字符串大量操作 | 适用于单线程环境中的字符串拼接 |
ArrayList
非线程安全
// 查看 ArrayList 类的 add() 方法定义
public boolean add(E e) {ensureCapacityInternal(size + 1); // 集合扩容,确保能新增数据elementData[size++] = e; // 在新增位置存放数据return true;
}
ArrayList 类的 add() 方法为非同步方法。当多个线程向同一个 ArrayList 对象添加数据时,可能出现数据不一致问题
Hashtable
线程安全
Hashtable<String,String> hashtable = new Hashtable<>();
hashtable.put("","");public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.......
}
HashMap
非线程安全
HashMap:在多线程环境中,可能会导致数据丢失或结构破坏。
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put("","");public V put(K key, V value) {return putVal(hash(key), key, value, false, true);
}
Vector
线程安全
Vector vector = new Vector();
vector.add("");public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;
}
相关文章:
【高级编程】synchronized 解决并发问题 类的线程安全类型
文章目录 并发问题同步方法同步代码块 线程安全类型ArrayListHashtableHashMapVector 多线程共享数据引发的问题 模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。 public class Site implements Runnable {int count 10; // …...
Speculative RAG:为知识密集型数据服务的RAG
论文链接 RAG的一个棘手问题是不知道该召回多少chunk,少了可能丢信息,多了会引入噪声信息。虽然有self-reasoning等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景ÿ…...
[Go]-抢购类业务方案
文章目录 要点:1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分:1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…...
Android 源码多个Launcher设置默认Launcher
目录 第一部分、android10之前 一.多个launcher 启动设置默认launcher的核心类 二 在自定义服务里面设置默认Launcher 第二部分、android10之后 一、Launcher应用内置并设置为默认Launcher 1.通过ResolverActivity.java设置为默认Launcher 改法一: 改法二&am…...
计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
深度学习中实验、观察与思考的方法与技巧
在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。以下是一些有效的方法与技巧,可以帮助你在深度学习实践中系统性地开展实验、分析结果并进行深入思考: 1. 明确实验目标 在开始实验前,确保对实验的目标有清晰的定…...
记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享
一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...
http连接github远程仓库密码问题解决办法
目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...
LAMP环境下项目部署
目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...
Visual Studio 2022从外部引入dll导致的问题
这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...
大模型从失败中学习 —— 微调大模型以提升Agent性能
人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...
10.web应用体系以及windows网络常见操作应用
一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...
【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721
1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...
机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
机器学习之实战篇——Mnist手写数字0~9识别(全连接神经网络模型) 文章传送MNIST数据集介绍:实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练,测试,评估模型优化 文章传送 机器学习之监督学习&#…...
ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解
https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉:生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐(Biten et al.,2022)或通过数据增强减少对象共现模…...
数据库系统 第54节 数据库优化器
数据库优化器是数据库管理系统(DBMS)中的一个关键组件,它的作用是分析用户的查询请求,并生成一个高效的执行计划。这个执行计划定义了如何访问数据和执行操作,以最小化查询的执行时间和资源消耗。以下是数据库优化器的…...
微服务杂谈
几个概念 还是第一次听说Spring Cloud Alibaba ,真是孤陋寡闻了,以前只知道 SpringCloud 是为了搭建微服务的,spring boot 则是快速创建一个项目,也可以是一个微服务 。那么SpringCloud 和 Spring boot 有什么区别呢?S…...
【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理
1 数据清洗 #### 概述数据清洗是指对原始数据进行处理和转换,以去除无效、重复、缺失或错误的数据,使数据符合分析的要求。#### 作用和意义- 提高数据质量:- 通过数据清洗,数据质量得到提升,减少错误分析和错误决策。…...
如何分辨IP地址是否能够正常使用
在互联网的日常使用中,无论是进行网络测试、网站访问、数据抓取还是远程访问,一个正常工作的IP地址都是必不可少的。然而,由于各种原因,IP地址可能无法正常使用,如被封禁、网络连接问题或配置错误等。本文将详细介绍如…...
Sqoop 数据迁移
Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
