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

多线程扩展:乐观锁、多线程练习

悲观锁、乐观锁

悲观锁:一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差。

乐观锁:一开始不上锁,认为是没有问题的,等要出现线程安全问题的时候才开始控制。线程安全,性能较好

练习

需求:

  • 有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;}
}

相关文章:

多线程扩展:乐观锁、多线程练习

悲观锁、乐观锁 悲观锁&#xff1a;一上来就加锁&#xff0c;没有安全感&#xff0c;每次只能一个线程进入访问完毕后&#xff0c;再解锁。线程安全&#xff0c;性能较差。 乐观锁&#xff1a;一开始不上锁&#xff0c;认为是没有问题的&#xff0c;等要出现线程安全问题的时…...

代码随想录day31 Java版

今天开始刷动态规划&#xff0c;先拿简单题练手 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&#xff0c;就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序&#xff0c;说白了就是调试工具。 adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff0c;默认情况下adb会…...

【Golang星辰图】全面解析:Go语言在Web开发中的顶尖库和框架

创造无限可能&#xff1a;探索Go语言在Web开发中的强大库和框架 前言 Go语言作为一门简洁、高效的编程语言&#xff0c;在Web开发领域也展现出了强大的潜力。本文将会带您深入了解Go语言在Web开发中的相关库和框架&#xff0c;以及它们的优势和使用方法。通过学习这些内容&am…...

CSS 居中对齐 (水平居中 )

水平居中 1.文本居中对齐 内联元素&#xff08;给容器添加样式&#xff09; 限制条件&#xff1a;仅用于内联元素 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-边缘检测

摘要&#xff1a; 本文介绍了使用Python和OpenCV进行边缘检测的方法&#xff0c;涵盖了基本概念、核心组件、工作流程&#xff0c;以及详细的实现步骤和代码示例。同时&#xff0c;文章也探讨了相关的技巧与实践&#xff0c;并给出了常见问题与解答。通过阅读本文&#xff0c;…...

C#中使用 Prism 框架

C#中使用 Prism 框架 前言一、安装 Prism 框架二、模块化开发三、依赖注入四、导航五、事件聚合六、状态管理七、测试 前言 Prism 框架是一个用于构建可维护、灵活和可扩展的 XAML 应用程序的框架。它提供了一套工具和库&#xff0c;帮助开发者实现诸如依赖注入、模块化、导航…...

什么是线程池,线程池的概念、优点、缺点,如何使用线程池,最大线程池怎么定义?

线程池&#xff08;Thread Pool&#xff09;是一种并发编程中常用的技术&#xff0c;用于管理和重用线程。它由线程池管理器、工作队列和线程池线程组成。 线程池的基本概念是&#xff0c;在应用程序启动时创建一定数量的线程&#xff0c;并将它们保存在线程池中。当需要执行任…...

吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)

在本实验中&#xff0c;您将对比回归和分类。 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 在学等差数列和等比数列&#xff0c;当已知前三项时&#xff0c;就可以知道是等差数列还是等比数列。现在给你序列的前三项&#xff0c;这个序列要么是等差序列&#xff0c;要么是等比序列&#xff0c;你能求出第 m项的值吗。 如果第 项的值太大&#xff0c;对…...

Nexus - Maven私服构建和使用

文章目录 1. Maven 私服简介2. Nexus下载安装3. 如何使用Nexus私服3.1 通过Nexus下载Jar包3.2 将Jar包部署到Nexus3.3 引用别人部署的jar包 1. Maven 私服简介 Maven 私服是一种特殊的Maven远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远…...

SpringMVC09、Ajax

9、Ajax 9.1、简介 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 Ajax 不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互…...

【数据结构初阶 9】内排序

文章目录 &#x1f308; 1. 直接插入排序&#x1f308; 2. 希尔排序&#x1f308; 3. 简单选择排序&#x1f308; 4. 堆排序&#x1f308; 5. 冒泡排序&#x1f308; 6. 快速排序6.1 霍尔版快排6.2 挖坑版快排6.3 双指针快排6.4 非递归快排 &#x1f308; 7. 归并排序7.1 递归版…...

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…...

HarmonyOS通过 axios发送HTTP请求

我之前的文章 HarmonyOS 发送http网络请求 那么今天 我们就来说说axios 这个第三方工具 想必所有的前端开发者都不会陌生 axios 本身也属于 HTTP请求 所以鸿蒙开发中也支持它 但首先 想在HarmonyOS中 使用第三方工具库 就要先下载安装 ohpm 具体可以参考我的文章 HarmonyOS 下…...

【Kafka系列 08】生产者消息分区机制详解

一、前言 我们在使用 Apache Kafka 生产和消费消息的时候&#xff0c;肯定是希望能够将数据均匀地分配到所有服务器上。 比如很多公司使用 Kafka 收集应用服务器的日志数据&#xff0c;这种数据都是很多的&#xff0c;特别是对于那种大批量机器组成的集群环境&#xff0c;每分…...

【PyTorch】进阶学习:BCEWithLogitsLoss在多标签分类任务中的正确使用---logits与标签形状指南

【PyTorch】进阶学习&#xff1a;BCEWithLogitsLoss在多标签分类任务中的正确使用—logits与标签形状指南 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、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终极指南&#xff1a;3步搞定黑苹果EFI配置&#xff0c;安装效率提升80% 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果…...

配置管理方案环境变量与配置文件

配置管理方案&#xff1a;环境变量与配置文件的智慧之道 在现代软件开发与运维中&#xff0c;配置管理是确保系统灵活性和可维护性的核心环节。环境变量与配置文件作为两种主流的配置管理方式&#xff0c;各有优劣&#xff0c;适用于不同场景。环境变量适合动态调整、敏感信息…...

AudioSeal Pixel Studio惊艳效果展示:水印嵌入前后MOS语音质量主观评测结果

AudioSeal Pixel Studio惊艳效果展示&#xff1a;水印嵌入前后MOS语音质量主观评测结果 1. 专业级音频水印技术揭秘 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的音频保护工具。它能在几乎不影响音质的情况下&#xff0c;为音频添加隐形的数字水印&#x…...

DASD-4B-Thinking效果展示:Chainlit界面下机器学习模型选择逻辑链推理

DASD-4B-Thinking效果展示&#xff1a;Chainlit界面下机器学习模型选择逻辑链推理 重要提示&#xff1a;本文展示的DASD-4B-Thinking模型为开源项目&#xff0c;所有技术内容均基于公开可获取的AI技术和工具&#xff0c;不涉及任何敏感或受限制的技术领域。 1. 模型核心能力概览…...

MobaXterm高效运维:通过SSH图形化管理远程Pixel Couplet Gen服务器

MobaXterm高效运维&#xff1a;通过SSH图形化管理远程Pixel Couplet Gen服务器 1. 为什么选择MobaXterm进行远程运维 对于运维人员来说&#xff0c;管理远程服务器是日常工作的重要组成部分。特别是当我们需要管理部署在星图GPU服务器上的Pixel Couplet Gen这类AI服务时&…...

手把手教你部署Qwen3.5-9B:90亿参数大模型,小白也能快速上手

手把手教你部署Qwen3.5-9B&#xff1a;90亿参数大模型&#xff0c;小白也能快速上手 1. 项目概述 Qwen3.5-9B是阿里云开源的一款90亿参数大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。最新版本还支持多模态理解&#xff08;图文输入&#xff09;和长达…...

Vue Router Composition API 完全指南:现代化路由开发的必备技能

Vue Router Composition API 完全指南&#xff1a;现代化路由开发的必备技能 【免费下载链接】router &#x1f6a6; The official router for Vue.js 项目地址: https://gitcode.com/gh_mirrors/router6/router Vue Router 作为 Vue.js 官方路由管理器&#xff0c;随着…...

OFA-large视觉蕴含效果展示:SNLI-VE测试集惊艳匹配案例集

OFA-large视觉蕴含效果展示&#xff1a;SNLI-VE测试集惊艳匹配案例集 1. 引言&#xff1a;当图像遇见文字&#xff0c;AI如何理解它们的关系&#xff1f; 想象一下这样的场景&#xff1a;你看到一张图片&#xff0c;里面有两只鸟站在树枝上。如果有人问你&#xff1a;"图…...

Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析

Qwen3-TTS实战&#xff1a;VMware环境搭建、模型部署与语音生成全解析 1. 为什么选择VMware部署Qwen3-TTS&#xff1f; 在本地部署AI模型时&#xff0c;环境隔离和资源管理常常让人头疼。VMware虚拟机提供了一种优雅的解决方案&#xff0c;特别适合像Qwen3-TTS这样的语音生成…...

Xmake进阶指南---打造高效Qt开发工作流

1. 为什么选择Xmake构建Qt项目&#xff1f; 第一次接触Qt开发的朋友&#xff0c;往往会被官方推荐的qmake或CMake构建工具劝退。我至今记得五年前接手一个遗留Qt项目时&#xff0c;面对.pro文件中晦涩的语法和复杂的平台条件判断&#xff0c;整整花了两天才让项目正常编译。直到…...