java多少线程操作共享数据线程安全问题加锁

1、有问题的写法
AdminController文件

package com.controller;import com.myThread.AdminThread;
import com.myThread.MyCallable;
import com.myThread.MyRunnable;
import org.springframework.web.bind.annotation.*;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;@RestController
@CrossOrigin
@RequestMapping("/admin")
public class AdminController{public static int count = 10;@GetMapping("/{id}")public long findById(@PathVariable Long id) throws InterruptedException {AdminThread t1 = new AdminThread();AdminThread t2 = new AdminThread();t1.start();t2.start();return id;}
}

AdminThread文件

package com.myThread;import com.controller.AdminController;public class AdminThread extends Thread{@Overridepublic void run() {while (true){if(AdminController.count == 0){break;}AdminController.count--;System.out.print(getName()+"线程"+AdminController.count+"\n");}}
}

执行结果,可以看到重复执行,不安全
在这里插入图片描述

解决方法加锁
AdminController文件

package com.controller;import com.myThread.AdminThread;
import com.myThread.MyCallable;
import com.myThread.MyRunnable;
import org.springframework.web.bind.annotation.*;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;@RestController
@CrossOrigin
@RequestMapping("/admin")
public class AdminController{//数量public static int count = 10;//锁对象public static final Object lock = new Object();public static boolean flag = false;@GetMapping("/{id}")public long findById(@PathVariable Long id) throws InterruptedException {AdminThread t1 = new AdminThread();AdminThread t2 = new AdminThread();t1.start();t2.start();return id;}
}

AdminThread文件

package com.myThread;import com.controller.AdminController;public class AdminThread extends Thread{@Overridepublic void run() {while (true){synchronized(AdminController.lock){if(AdminController.count == 0){break;}else{if(!AdminController.flag){//操作AdminController.count--;System.out.print(getName()+"线程"+AdminController.count+"\n");//释放AdminController.lock.notifyAll();}else{//一直循环监听try {AdminController.lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}}
}

AdminThread上面这个!会有空执行(虽然没有错,但多跑了一点点),应该下面这样

package com.myThread;import com.controller.AdminController;public class AdminThread extends Thread{@Overridepublic void run() {while (true){synchronized(AdminController.lock){if(AdminController.count == 0){break;}else{//操作AdminController.count--;System.out.print(getName()+"线程"+AdminController.count+"\n");//释放AdminController.lock.notifyAll();}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412915.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系分备考计算机网络传输介质、通信方式和交换方式

文章目录 1、概述2、传输介质3、网络通信4、网络交换5、总结 1、概述 计算机网路是系统分析师考试的常考知识点,本篇主要记录了知识点:网络传输介质、网络通信和数据交换方式等。 2、传输介质 网络的传输最常见的就是网线,也就是双绞线&…

VirtualBox安装openSUSE-Leap-15.5虚拟机并配置网络

VirtualBox安装openSUSE-Leap-15.5虚拟机并配置网络 适用于在VirtualBox平台上安装openSUSE-Leap-15.5虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径Oracle VM VirtualBoxVirtualBox-7.0.12-159484D:\softwareopenSUSE-Leapopen…

MySQL——性能优化与关系型数据库

文章目录 什么是性能?什么是关系型数据库?数据库设计范式 常见的数据库SQL语言结构化查询语言的六个部分版本 MySQL数据库故事历史版本5.6/5.7差异5.7/8.0差异 什么是性能? 吞吐与延迟:有些结论是反直觉的,指导我们关…

js动态设置关键侦@keyframes

js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%;to 等价与 100% // 或…

行为树(Behavior Trees)

行为树(Behavior Trees)是一种在游戏开发中广泛使用的AI设计模式,主要用于描述AI的行为和决策过程,实现更加智能和自然的游戏AI。它由多个节点组成,每个节点代表一个行为或决策,按照特定的方式连接在一起&a…

UI自动化测试框架

文章目录 UI自动化基础什么是UI自动化测试框架UI自动化测试框架的模式数据驱动测试框架关键字驱动测试框架行为驱动测试框架 UI自动化测试框架的作用UI自动化测试框架的核心思想UI自动化测试框架的步骤UI自动化测试框架的构成UtilsLog.javaReadProperties.Java coreBaseTest.ja…

前端框架前置学习Node.js(2)npm使用,Node.js总结

npm - 软件包管理器 定义 npm是Node.js标准的软件包管理器 npm仓库中包含大量软件包,使其成为世界上最大的单一语言代码仓,并且可以确定几乎可用于一切的软件包 最初是为了下载和管理Node.js包依赖的方式,但其现在已成为前端JavaScript中使用的工具 使用: 1.初始化清单文…

【华为 ICT HCIA eNSP 习题汇总】——题目集3

1、(多选)IEEE 802.11n支持在哪些频率下工作? A、2.5GHz B、2.4GHz C、5GHz D、6GHz 考点:无线局域网 解析:(BC) IEEE 820.11n 支持双频段,它兼容IEEE 802.11a 与IEEE 820.11b 两种标…

加解密算法整理(对称加密、非堆成加密、散列函数)

加解密算法是现代密码学核心技术,从设计理念和应用场景上可以分为两大基本类型,如下表所示。 算法类型特点优势缺陷代表算法对称加密加解密的密钥相同计算效率高,加密强度高需提前共享密钥,易泄露DES、3DES、AES、IDEA非对称加密…

【vsan数据恢复】vsan逻辑架构出现故障的数据恢复案例

VSAN数据恢复环境: 一套有三台服务器节点的VSAN超融合基础架构,每台服务器节点上配置2块SSD硬盘和4块机械硬盘。 每个服务器节点上配置有两个磁盘组,每个磁盘组使用1个SSD硬盘作为缓存盘,2个机械硬盘作为容量盘。三台服务器节点上…

全面了解SSD,SSD关键术语全面解析

在前文《深入了解一下SSD的相关内容》一文中我们介绍了SSD硬盘的内部结构和存储颗粒的读写特性。本文我们将进一步深入存储颗粒,介绍其中内部的更多细节以及与此相关的一些术语。 我们继续深入到SSD的内部,SSD闪存颗粒分为NAND和NOR等不同的种类,目前SSD硬盘以NAND为主。NA…

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测(完整源码和数据) 1.data为数据集&a…