线程非同步的代码
/*
* 取钱线程不安全
*/
public class UnsafeTest02 {
public static void main(String[] args) {
//账户
Account account=new Account(100,"结婚礼金");
Drawing you=new Drawing(account,80,"可悲的你");
Drawing wife=new Drawing(account,90,"happy的她");
you.start();
wife.start();
}
}
//账户
class Account{
int money;//金额
String name;//名称
public Account(int money, String name) {
this.money = money;
this.name = name;
}
}
//模拟取款
class Drawing extends Thread{
Account account;//取钱的账户
int drawingMoney;//取的钱数
int packetTotal;//口袋的钱
public Drawing(Account account, int drawingMoney,String name) {
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
}
@Override
public void run() {
if(account.money-drawingMoney<0) {
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.money-=drawingMoney;
packetTotal+=drawingMoney;
System.out.println(this.getName()+"-->账户余额为:"+account.money);
System.out.println(this.getName()+"-->口袋的钱为:"+packetTotal);
}
}
package cn.jd.syn;
/*
* 线程不安全:数据有负数还有相同的情况
*/
public class UnsafeTest01 {
public static void main(String[] args) {
//一份资源
UnsafeWeb12306 web=new UnsafeWeb12306();
//多个代理
new Thread(web,"laoda").start();
new Thread(web,"laoer").start();
new Thread(web,"laosan").start();
}
}
class UnsafeWeb12306 implements Runnable{
//票数
private int ticketNums=3;
private boolean flag=true;
@Override
public void run() {
while(flag) {
test();
}
}
public void test() {
if(ticketNums<0) {
flag=false;
return;
}
//模拟网络延时
try {
Thread.sleep(200);
//进入了阻塞状态,然后200s以后我就重新等待CPU的调用
//继续执行下面的代码
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
package cn.jd.syn;
import java.util.ArrayList;
import java.util.List;
/*
* 取钱线程不安全
* 操作容器
*/
public class UnsafeTest03 {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
for(int i=0;i<10000;i++) {
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
System.out.println(list.size()); //发现有些数据丢掉了,显然是被覆盖了
}
}