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

Java中线程安全问题解决方案

线程安全问题:多个线程操作同一个属性时,会有安全问题

方式一:同步代码块

说明
① 将存在线程安全的代码,用synchronized同步代码块包裹(上锁、解锁)

② 如果有线程正在执行同步代码块中的代码,则其它线程需要等待此线程执行完之后,再继续抢占CPU执行权
synchronized(同步监视器),同步监视器必须是唯一的对象,相对于所有线程而言,他们都需要使用同一个对象(任何对象都可以,实现Runnable方式中最简单的是this,继承Thread方式中最简单的是当前类.class)

  1. 实现Runnable方式

    public class Test {
    	public static void main (String[] args) {
    		Ticket t = new Ticket();
    		new Thread(t).start();
    		new Thread(t).start();
    		new Thread(t).start();
    	}
    }
    class Ticket implements Runnable {
    	int ticket = 10; 
    	public void run() {
    		while(true) {
    			// 使用this充当唯一的对象
    			synchronized(this) {
    				// 【ticket-start】 下面部分代码操作了公共属性ticket,为了防止线程安全问题,需要使用synchronized包裹
    				if (ticket > 0) {
    					System.out.println(Thread.currentThread().getName() + "-票号为:" + ticket--);
    				} else {
    					System.out.println("已售完");
    					break;
    				}
    				// 【ticket-end】	
    			}
    		}
    	}
    }
    
  2. 继承Thread方式

    public class Test {
    	public static void main (String[] args) {
    		
    	}
    }
    class Ticket extends Thread {
    	static int ticket = 10;
    	public void run() {
    		while(true) {
    			// 使用Ticket.class充当唯一的对象
    			synchronized(Ticket.class) {
    				// 【ticket-start】 下面部分代码操作了公共属性ticket,为了防止线程安全问题,需要使用synchronized包裹
    				if (ticket > 0) {
    					System.out.println(Thread.currentThread().getName() + "-票号为:" + ticket--);
    				} else {
    					System.out.println("已售完");
    					break;
    				}
    				// 【ticket-end】	
    				}
    		}
    	}
    }
    

http://www.kler.cn/a/369246.html

相关文章:

  • CentOS进入单用户模式进行密码重置
  • DO・PO・DTO・BO・AO・VO
  • C# 创建型设计模式之----单例模式
  • 深入探索:深度学习在时间序列预测中的强大应用与实现
  • 【QT】Qt窗口(上)
  • 联想笔记本电脑睡眠后打开黑屏解决方法
  • 【软件设计】常用设计模式--代理模式
  • Leetcode 二叉树的右视图
  • cargo编译时Rust时如何自定义输出目录
  • 今年2024的1024文章
  • 微服务的发布策略与设计约束
  • springboot073车辆管理系统设计与实现(论文+源码)_kaic.zip
  • 详析STL之容器map
  • R语言笔记(四):函数
  • Qt 窗口可见性 之 工程案例
  • Spark的Torrent Broadcast 详解
  • 基于YOLOv11的动物类别实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)
  • Python 基础语法 - 赋值运算符
  • 无人机之倾斜摄影技术篇
  • 【代码随想录Day53】图论Part05
  • 海外服务器的价格取决于服务器的性能和租赁时间
  • leetcode-73-矩阵置零
  • 【LeetCode】每日一题 2024_10_22 构成整天的下标对数目 I(暴力/哈希)
  • Golang | Leetcode Golang题解之第502题IPO
  • 嵌入式1_ARM学习(六)——Makefile
  • 【GPIO】2.ADC配置错误,还是能得到电压数据