多线程处理共享数据可能引发数据风险问题及解决方案

多线程处理共享数据可能引发数据安全问题【票数越剩越多;两人抢同一张票;】
解决方案1:自定义方法加上sychonized修饰,并用flag进行判断;然后在run()调用自定义的方法
2. 在run()中添加同步代码块
***********************************************************************************************1-1

package cn.kgc.tyl.test1010.unsafe;
/**
*
3个人购买十张票,不使用锁

  • */
    public class ByTicket implements Runnable {
    private int count=10;//剩余的票数
    private int num=0;//当前购买票的编号
    @Override
    public void run() {
    while (true) {
    if (count<=0) {
    break;
    }
    //修改数据

     	count--;
     	num++;
     	//输出购票信息
     	System.out.println("购票人"+Thread.currentThread().getName()+"买了第"+num+"张票,剩余"+count+"张");
     	
     }
    

    }

}
***********************************************************************************************1-2
package cn.kgc.tyl.test1010.unsafe;

public class TestByTicket {
public static void main(String[] args) {
ByTicket b =new ByTicket();//共享数据,所以只实例化一次实现runnable的接口类
Thread t1=new Thread(b,“唐哥”);
Thread t2=new Thread(b,“远哥”);
Thread t3=new Thread(b,“黄牛”);
t1.start();
t2.start();
t3.start();
}
}
/**
*
购票人唐哥买了第2张票,剩余8张
购票人唐哥买了第4张票,剩余6张
购票人唐哥买了第5张票,剩余5张
购票人唐哥买了第6张票,剩余4张
购票人唐哥买了第7张票,剩余3张
购票人唐哥买了第8张票,剩余2张
购票人唐哥买了第9张票,剩余1张
购票人黄牛买了第3张票,剩余7张
购票人远哥买了第2张票,剩余8张
购票人唐哥买了第10张票,剩余0张

  • */
    *********************************************************************************************2-1
    package cn.kgc.tyl.test1010.safeDaiMaKuai;
    //选中当前行的快捷键可以用【删除】CTRL+D,然后【撤回】Ctrl+z;
    //复制本行到下一行alt+ctrl+向下翻页键;
    /

3个人购买十张票,自定义同步方法时,需要使用flag进行判断;

  • /
    public class ByTicket2 implements Runnable {
    private int count=10;//剩余的票数
    private int num=0;//当前购买票的编号
    private boolean flag=true;//假如还有剩余
    /
    *
    *同步方法

    • */
      public synchronized void sale() {
      if (count<=0) {
      flag=false;
      return;
      }
      count–;
      num++;
      System.out.println(Thread.currentThread().getName()+“买了第”+num+“张票,剩余”+count+“张”);

    }
    @Override
    public void run() {
    while (flag) {
    sale();
    }
    }

}
***********************************************************************************************2-2
package cn.kgc.tyl.test1010.safeDaiMaKuai;

public class TestBuyTicket2 {
public static void main(String[] args) {
ByTicket2 b=new ByTicket2();
Thread person1=new Thread(b, “唐哥”);
Thread person2=new Thread(b, “远哥”);
Thread person3=new Thread(b, “黄牛哥”);
person1.start();
person2.start();
person3.start();

}
}
/**
*
唐哥买了第1张票,剩余9张
远哥买了第2张票,剩余8张
唐哥买了第3张票,剩余7张
唐哥买了第4张票,剩余6张
唐哥买了第5张票,剩余5张
唐哥买了第6张票,剩余4张
黄牛哥买了第7张票,剩余3张
黄牛哥买了第8张票,剩余2张
唐哥买了第9张票,剩余1张
唐哥买了第10张票,剩余0张

  • */

*********************************************************************************************3-1
package cn.kgc.tyl.test1010.safeMethod;
/

*
3个人购买十张票,在run()中进行同步代码块的使用;

  • */
    public class BuyTicket3 implements Runnable {
    private int count=10;//剩余的票数
    private int num=0;//当前购买票的编号

    @Override
    public void run() {
    while (true) {
    synchronized (this) {
    if (count<=0) {
    return;
    }
    //数据修改
    num++;
    count–;
    //输出信息
    System.out.println(Thread.currentThread().getName()+“买了第”+num+“张票,剩余”+count+“张”);

     	}
     }
    

    }

}

***********************************************************************************************3-2
package cn.kgc.tyl.test1010.safeMethod;

public class TestBuyIcket3 {
public static void main(String[] args) {
BuyTicket3 b=new BuyTicket3();
Thread person1=new Thread(b, “唐哥”);
Thread person2=new Thread(b, “远哥”);
Thread person3=new Thread(b, “黄牛哥”);
person1.start();
person2.start();
person3.start();
}
}
/**
*
唐哥买了第1张票,剩余9张
唐哥买了第2张票,剩余8张
唐哥买了第3张票,剩余7张
唐哥买了第4张票,剩余6张
唐哥买了第5张票,剩余5张
唐哥买了第6张票,剩余4张
唐哥买了第7张票,剩余3张
唐哥买了第8张票,剩余2张
黄牛哥买了第9张票,剩余1张
黄牛哥买了第10张票,剩余0张

  • */
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_45442261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值