多线程扩展:乐观锁、多线程练习
悲观锁、乐观锁
悲观锁:一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差。
乐观锁:一开始不上锁,认为是没有问题的,等要出现线程安全问题的时候才开始控制。线程安全,性能较好
练习
需求:
- 有100份礼品,小明、小红同时发送,当剩下的礼品小于10的时候则不再送出利用多线程模拟该过程并将线程的名称打印出来,并最后在控制台分别打印小红、小明各种送出多少份礼品
Test类
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Test {public static void main(String[] args) throws Exception {// 目标:有100份礼品,小明、小红同时发送,当剩下的礼品小于10的时候则不再送出// 利用多线程模拟该过程并将线程的名称打印出来,并最后在控制台分别打印小红、小明各种送出多少份礼品// 拿100分礼品到程序中来List<String> gift = new ArrayList<>();String[] names = {"口红","包包","鲜花","剃须刀","皮带","手表"};Random r = new Random();for (int i = 0; i < 100; i++) {gift.add(names[r.nextInt(names.length)] + (i+1));}System.out.println(gift);//定义线程类,创建线程对象,去集合中拿礼物给别人SendThread xm = new SendThread(gift,"小明");xm.start();SendThread xh = new SendThread(gift,"小红");xh.start();xm.join();xh.join();System.out.println(xm.getCount());System.out.println(xh.getCount());}
}
SendThread类
import java.util.List;
import java.util.Random;public class SendThread extends Thread{private List<String> gift;private int count;public SendThread(List<String> gift, String name) {super(name);this.gift = gift;}@Overridepublic void run() {String name = Thread.currentThread().getName();// 小明、小红发礼物出去// 实现线程安全问题// 注意1:锁必须唯一Random r = new Random();while (true){synchronized (gift){if (gift.size() < 10){break;}String rs = gift.remove(r.nextInt(gift.size()));System.out.println(name + "发出了:" + rs);count++;}}}public int getCount() {return count;}public void setCount(int count){this.count = count;}
}
相关文章:
多线程扩展:乐观锁、多线程练习
悲观锁、乐观锁 悲观锁:一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差。 乐观锁:一开始不上锁,认为是没有问题的,等要出现线程安全问题的时…...
代码随想录day31 Java版
今天开始刷动态规划,先拿简单题练手 509. 斐波那契数 class Solution {public int fib(int n) {if (n < 1) return n; int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int index 2; index < n; index){dp[index] dp[index - 1] dp[index -…...
linux系统adb调试工具
adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会…...
【Golang星辰图】全面解析:Go语言在Web开发中的顶尖库和框架
创造无限可能:探索Go语言在Web开发中的强大库和框架 前言 Go语言作为一门简洁、高效的编程语言,在Web开发领域也展现出了强大的潜力。本文将会带您深入了解Go语言在Web开发中的相关库和框架,以及它们的优势和使用方法。通过学习这些内容&am…...
CSS 居中对齐 (水平居中 )
水平居中 1.文本居中对齐 内联元素(给容器添加样式) 限制条件:仅用于内联元素 display:inline 和 display: inline-block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…...
数据结构:图及相关算法讲解
图 1.图的基本概念2. 图的存储结构2.1邻接矩阵2.2邻接表2.3两种实现的比较 3.图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历 4.最小生成树4.1 Kruskal算法4.2 Prim算法4.3 两个算法比较 5.最短路径5.1两个抽象存储5.2单源最短路径--Dijkstra算法5.3单源最短路径--Bellman-…...
【c++设计模式06】创建型4:单例模式(Singleton Pattern)
【c++设计模式06】创建型4:单例模式(Singleton Pattern) 一、定义二、适用场景三、确保,一个类可以实例化一个对象四、分类1、懒汉式——首次访问时才创建实例2、饿汉式——类加载时就创建实例五、线程安全性深入讨论(懒汉式单例模式)1、懒汉式单例真的线程不安全吗?——…...
Python-OpenCV-边缘检测
摘要: 本文介绍了使用Python和OpenCV进行边缘检测的方法,涵盖了基本概念、核心组件、工作流程,以及详细的实现步骤和代码示例。同时,文章也探讨了相关的技巧与实践,并给出了常见问题与解答。通过阅读本文,…...
C#中使用 Prism 框架
C#中使用 Prism 框架 前言一、安装 Prism 框架二、模块化开发三、依赖注入四、导航五、事件聚合六、状态管理七、测试 前言 Prism 框架是一个用于构建可维护、灵活和可扩展的 XAML 应用程序的框架。它提供了一套工具和库,帮助开发者实现诸如依赖注入、模块化、导航…...
什么是线程池,线程池的概念、优点、缺点,如何使用线程池,最大线程池怎么定义?
线程池(Thread Pool)是一种并发编程中常用的技术,用于管理和重用线程。它由线程池管理器、工作队列和线程池线程组成。 线程池的基本概念是,在应用程序启动时创建一定数量的线程,并将它们保存在线程池中。当需要执行任…...
吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)
在本实验中,您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)jupy…...
序列的第 k 个数(c++题解)
题目描述 BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 m项的值吗。 如果第 项的值太大,对…...
Nexus - Maven私服构建和使用
文章目录 1. Maven 私服简介2. Nexus下载安装3. 如何使用Nexus私服3.1 通过Nexus下载Jar包3.2 将Jar包部署到Nexus3.3 引用别人部署的jar包 1. Maven 私服简介 Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远…...
SpringMVC09、Ajax
9、Ajax 9.1、简介 AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互…...
【数据结构初阶 9】内排序
文章目录 🌈 1. 直接插入排序🌈 2. 希尔排序🌈 3. 简单选择排序🌈 4. 堆排序🌈 5. 冒泡排序🌈 6. 快速排序6.1 霍尔版快排6.2 挖坑版快排6.3 双指针快排6.4 非递归快排 🌈 7. 归并排序7.1 递归版…...
后端八股笔记------Redis
Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术,延时是因为数据库有主从问题需要更新,无法达到完全的强一致性,只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码👇 写锁Ǵ…...
HarmonyOS通过 axios发送HTTP请求
我之前的文章 HarmonyOS 发送http网络请求 那么今天 我们就来说说axios 这个第三方工具 想必所有的前端开发者都不会陌生 axios 本身也属于 HTTP请求 所以鸿蒙开发中也支持它 但首先 想在HarmonyOS中 使用第三方工具库 就要先下载安装 ohpm 具体可以参考我的文章 HarmonyOS 下…...
【Kafka系列 08】生产者消息分区机制详解
一、前言 我们在使用 Apache Kafka 生产和消费消息的时候,肯定是希望能够将数据均匀地分配到所有服务器上。 比如很多公司使用 Kafka 收集应用服务器的日志数据,这种数据都是很多的,特别是对于那种大批量机器组成的集群环境,每分…...
【PyTorch】进阶学习:BCEWithLogitsLoss在多标签分类任务中的正确使用---logits与标签形状指南
【PyTorch】进阶学习:BCEWithLogitsLoss在多标签分类任务中的正确使用—logits与标签形状指南 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTo…...
ocr关键信心提取数据集
doc/doc_ch/dataset/kie_datasets.md PaddlePaddle/PaddleOCR - Gitee.com https://huggingface.co/datasets/howard-hou/OCR-VQA OCR-VQA Dataset | Papers With Code...
OpCore Simplify终极指南:3步搞定黑苹果EFI配置,安装效率提升80%
OpCore Simplify终极指南:3步搞定黑苹果EFI配置,安装效率提升80% 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果…...
配置管理方案环境变量与配置文件
配置管理方案:环境变量与配置文件的智慧之道 在现代软件开发与运维中,配置管理是确保系统灵活性和可维护性的核心环节。环境变量与配置文件作为两种主流的配置管理方式,各有优劣,适用于不同场景。环境变量适合动态调整、敏感信息…...
AudioSeal Pixel Studio惊艳效果展示:水印嵌入前后MOS语音质量主观评测结果
AudioSeal Pixel Studio惊艳效果展示:水印嵌入前后MOS语音质量主观评测结果 1. 专业级音频水印技术揭秘 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的音频保护工具。它能在几乎不影响音质的情况下,为音频添加隐形的数字水印&#x…...
DASD-4B-Thinking效果展示:Chainlit界面下机器学习模型选择逻辑链推理
DASD-4B-Thinking效果展示:Chainlit界面下机器学习模型选择逻辑链推理 重要提示:本文展示的DASD-4B-Thinking模型为开源项目,所有技术内容均基于公开可获取的AI技术和工具,不涉及任何敏感或受限制的技术领域。 1. 模型核心能力概览…...
MobaXterm高效运维:通过SSH图形化管理远程Pixel Couplet Gen服务器
MobaXterm高效运维:通过SSH图形化管理远程Pixel Couplet Gen服务器 1. 为什么选择MobaXterm进行远程运维 对于运维人员来说,管理远程服务器是日常工作的重要组成部分。特别是当我们需要管理部署在星图GPU服务器上的Pixel Couplet Gen这类AI服务时&…...
手把手教你部署Qwen3.5-9B:90亿参数大模型,小白也能快速上手
手把手教你部署Qwen3.5-9B:90亿参数大模型,小白也能快速上手 1. 项目概述 Qwen3.5-9B是阿里云开源的一款90亿参数大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。最新版本还支持多模态理解(图文输入)和长达…...
Vue Router Composition API 完全指南:现代化路由开发的必备技能
Vue Router Composition API 完全指南:现代化路由开发的必备技能 【免费下载链接】router 🚦 The official router for Vue.js 项目地址: https://gitcode.com/gh_mirrors/router6/router Vue Router 作为 Vue.js 官方路由管理器,随着…...
OFA-large视觉蕴含效果展示:SNLI-VE测试集惊艳匹配案例集
OFA-large视觉蕴含效果展示:SNLI-VE测试集惊艳匹配案例集 1. 引言:当图像遇见文字,AI如何理解它们的关系? 想象一下这样的场景:你看到一张图片,里面有两只鸟站在树枝上。如果有人问你:"图…...
Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析
Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析 1. 为什么选择VMware部署Qwen3-TTS? 在本地部署AI模型时,环境隔离和资源管理常常让人头疼。VMware虚拟机提供了一种优雅的解决方案,特别适合像Qwen3-TTS这样的语音生成…...
Xmake进阶指南---打造高效Qt开发工作流
1. 为什么选择Xmake构建Qt项目? 第一次接触Qt开发的朋友,往往会被官方推荐的qmake或CMake构建工具劝退。我至今记得五年前接手一个遗留Qt项目时,面对.pro文件中晦涩的语法和复杂的平台条件判断,整整花了两天才让项目正常编译。直到…...
