多线程处理共享数据可能引发数据安全问题【票数越剩越多;两人抢同一张票;】
解决方案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张
- */