0
点赞
收藏
分享

微信扫一扫

线程的安全性问题

徐一村 2022-04-13 阅读 50

引入:书写一个卖票小程序的代码

//卖票逻辑书写阶段
//使用继承Thread的方法
public class Sellingtickets extends Thread{
    static int ticket=100;
    @Override
    /*
    * 卖票逻辑:三个窗口卖票,也就是说,只要三个窗口有票,就需要不停的使用循环来进行卖票操作
    * 工作过程,使用各自线程在循环体里开始卖票,cup随机分配在哪个窗口买票,所以卖票的票号会
    * 显示在不同的线程当中*/
    public void run() {
        while(true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"票号为"+ticket);
                ticket--;
            }
            else{
                break;//跳出此次循环
            }
        }
    }
}
//main函数书写阶段
public class Test {
    public static void main(String args[]){
        Sellingtickets Thread1=new Sellingtickets();//创建线程1
        Sellingtickets Thread2=new Sellingtickets();//创建线程2
        Sellingtickets Thread3=new Sellingtickets();//创建线程3
        Thread1.start();
        Thread2.start();
        Thread3.start();
    }

}

运行结果

得到重票

得到错票

 

 //代码实例

public class Sellingtickets extends Thread{
    static int ticket=100;
    static Lock A=new Lock();//造一把锁
    @Override
    /*
    * 卖票逻辑:三个窗口卖票,也就是说,只要三个窗口有票,就需要不停的使用循环来进行卖票操作
    * 工作过程,使用各自线程在循环体里开始卖票,cup随机分配在哪个窗口买票,所以卖票的票号会
    * 显示在不同的线程当中*/
    public void run() {
        while(true){
            synchronized (A){
                if(ticket>0){
                    System.out.println(Thread.currentThread().getName()+"票号为"+ticket);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket--;
                }
                else{
                    break;//跳出此次循环
                }

            }

        }
    }
}

运行结果(图未截完)

举报

相关推荐

0 条评论