完美解决Java中的线程安全问题
发布时间 - 2026-01-11 02:42:11 点击率:次给出一个问题,如下:
解决方案如下:
public class Demo_5 {
public static void main(String[] args) {
//创建一个窗口
TicketWindow tw1=new TicketWindow();
//使用三个线程同时启动
Thread t1=new Thread(tw1);
Thread t2=new Thread(tw1);
Thread t3=new Thread(tw1);
t1.start();
t2.start();
t3.start();
}
}
//售票窗口类
class TicketWindow implements Runnable{
private int nums=2000; //一共2000张票
@Override
public void run() {
while(true){
if(nums>0){ //先判断是否还有票
//Thread.currentThread().getName()得到当前线程的名字
System.out.println(Thread.currentThread().getName()+"在售出第"+nums+"张票"); //显示售票信息
//出票的速度是一秒出一张
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
nums--;
}else{
break; //售票结束
}
}
}
}
执行这段代码发现问题,就是同一张票号可能被多个售票窗口出售,惹祸的代码就是if else语句块。
解决方法就是在需要同步的代码段用synchronized(Object){你要同步的代码}即可。
修改后代码如下:
public class Demo_5 {
public static void main(String[] args) {
//创建一个窗口
TicketWindow tw1=new TicketWindow();
//使用三个线程同时启动
Thread t1=new Thread(tw1);
Thread t2=new Thread(tw1);
Thread t3=new Thread(tw1);
t1.start();
t2.start();
t3.start();
}
}
//售票窗口类
class TicketWindow implements Runnable{
private int nums=2000; //一共2000张票
@Override
public void run() {
while(true){
//认为if else这段代码要保证其原子性(同步代码块)
synchronized (this) {
if(nums>0){ //先判断是否还有票
//Thread.currentThread().getName()得到当前线程的名字
System.out.println(Thread.currentThread().getName()+"在售出第"+nums+"张票"); //显示售票信息
//出票的速度是一秒出一张
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
nums--;
}else{
break; //售票结束
}
}
}
}
}
执行这段代码发现出票正常了。
线程1正执行需要做同步处理的代码,线程2,3,4……blocked,被放入了线程等待池,就好像某人上厕所前先把门关上(上锁),完事之后再出来(解锁),然后别人就可以继续使用了。
以上这篇完美解决Java中的线程安全问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# java线程安全问题
# 详解java各种集合的线程安全
# Java中Map实现线程安全的3种方式
# Java线程安全基础概念解析
# Java 单例模式线程安全问题
# Java ThreadLocal 线程安全问题解决方案
# Java中ConcurrentHashMap是如何实现线程安全
# Java 集合线程安全的几种解决方法
# 这段
# 出票
# 给大家
# 创建一个
# 判断是否
# 多个
# 你要
# 希望能
# 一个问题
# 这篇
# 解决方法
# 上厕所
# 小编
# 大家多多
# 前先
# 保证其
# 就可以
# 再出
# 解锁
# 使用了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速生成高效建站系统源代码?
JavaScript如何实现音频处理_Web Audio API如何工作?
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何为API生成Swagger或OpenAPI文档
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
音乐网站服务器如何优化API响应速度?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何实现本地化和多语言支持?(i18n教程)
JS去除重复并统计数量的实现方法
如何挑选最适合建站的高性能VPS主机?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel怎么为数据库表字段添加索引以优化查询
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Java垃圾回收器的方法和原理总结
php json中文编码为null的解决办法
JavaScript模板引擎Template.js使用详解
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
如何在阿里云香港服务器快速搭建网站?
如何用VPS主机快速搭建个人网站?
android nfc常用标签读取总结
免费网站制作appp,免费制作app哪个平台好?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
利用 Google AI 进行 YouTube 视频 SEO 描述优化
网站页面设计需要考虑到这些问题
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何在建站宝盒中设置产品搜索功能?
如何用免费手机建站系统零基础打造专业网站?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
如何在万网利用已有域名快速建站?
JS弹性运动实现方法分析
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在云主机上快速搭建网站?
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何获取PHP WAP自助建站系统源码?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Laravel如何发送系统通知?(Notification渠道示例)
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复

