完美解决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渠道示例)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复