Java学习之线程安全详解(卖票案例)

本文深入探讨Java线程安全问题,通过一个卖票案例,讲解同步代码块和同步方法确保多线程环境下数据一致性。同步代码块使用特定对象作为锁,而静态同步方法则依赖于类字节码文件,确保线程安全。
摘要由CSDN通过智能技术生成

一、要求,有100张票,要求同时在三个窗口出售

首先创建卖票的类:

package com.edu_03;

public class ShellTicket implements Runnable{
	
	int tickets = 100;
	@Override
	public void run() {
		while (true) {//让窗口一直处于打开的状态
			if (tickets>0) {
				try {
					Thread.sleep(100);
					/*
					 * 在加入休眠之后出现了重复票和0张-1张票,出现了线程安全问题
						thread1进来,休眠
						thread2进来,休眠
						thread3进来,休眠
					*/
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				//thread1醒来,输出1,然后tickets = 0;
				//thread2醒来,输出0,然后tickets = -1;
				//thread3醒来,输出-1,然后tickets = -2;
				System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets--+"票");
				/*
				 * 1、打印这个变量的值
				 * 2、减一
				 * 3、把减一后的数据赋值给变量
				 */
			}
		}
	}

}
这是主程序:

package com.edu_03;

public class Test {
	public static void main(String[] args) {
		//创建对象
		ShellTicket st = new ShellTicket();
		
		//转换成线程对象
		Thread thread = new Thread(st);
		Thread thread2 = new Thread(st);
		Thread thread3 = new Thread(st);
		
		//给线程设置名字
		thread.setName("第一个");
		thread2.setName("第二个");
		thread3.setName("第三个");
		
		//开启线程
		thread.start();
		thread2.start();
		thread3.start();
	}
}
这是结果:

第三个正在出售第100票
第一个正在出售第99票
第二个正在出售第99票
第一个正在出售第98票
第三个正在出售第97票
第二个正在出售第96票
第二个正在出售第95票
第一个正在出售第94票
第三个正在出售第93票
第二个正在出售第91票
第一个正在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值