Demo14_售票程序

package test05;

public class Demo14_售票程序 {

public static void main(String[] args) {

//创建Runnable接口的子类对象
ticket t = new ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
// Thread t3 = new Thread(t);
// Thread t4 = new Thread(t);//线程在创建时没有运行
t2.start();//开启时运行
try{Thread.sleep(10);}catch(InterruptedException e){}
// 切换标记之前,让主线程停一下,这时就只有线程t1在,他就会执行同步代码块
t.flag = false ;

    t1.start();

// t3.start();
// t4.start();
}

}
/*
*实现多个人同时售票
*
*售票的动作需要同时执行,所以使用多线程技术
*
*
*多线程的安全问题 错误数据 -1 -2
*
*问题产生的原因
*1.多个线程在操作共享数据
*2.线程任务操作共享数据的代码有多条(运算有多个)
*
*解决思路
*只要让一个线程在执行线程任务是将多条操作共享数据的代码执行完,只要执行过程中不要让其他线程参与运算
*
*代码怎么体现呢?
*将判断语句与try catch 语句 封装起来
*Java代码中解决此问题用代码块完成 称之为 同步代码块 synchronized
*格式 。
*synchronized(对象)
*{
* //需要被同步的代码
*}
*
*同步代码块解决了代码的安全性问题
*弊端 降低了程序 效率
*
*前提
*必须保证多个线程在同步时使用同一个锁
*解决了当多线程发生问题时,加入了同步后,问题依旧
*就要通过这个同步的前提来判断同步是否书写正确
*
*同步函数和同步代码块区别
*
*同步函数使用的锁是固定的this,当线程只有一个同步时可以使用
*同步代码块使用的锁是任意对象,当线程任务需要多个同步时,必须用同步代码块
*/
class ticket implements Runnable
{
public boolean flag = true ;
//1.定义票的总数量
int tickets = 10 ;
@SuppressWarnings(“unused”)
private Object obj = new Object();
//2.售票的动作,这个动作会被多线程执行,那就是线程任务代码,需要定义在run方法中
//线程任务中一般有循环结构
@Override
public void run() {
if(flag)
{
while(true)
{
// synchronized(obj)
// {
this.sale();
// }
}
}
}
public synchronized void sale()//同步函数 所需要的同步代码
// 同步函数需要锁(函数的对象) 使用的对象时this
{
if( tickets > 0 )
{
//要让线程在这里等候,模拟问题的发生。 sleep 方法 出现 -1 -2 等错误数据,这就是多线程的安全问题
//静态方法直接 类名.方法 直接调用
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();//处理方式
}
System.out.println(Thread.currentThread().getName()+”……”+tickets–);//得知那张票是谁卖出的线程名字从Thread_0开始
}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值