欢迎光临散文网 会员登陆 & 注册

线程非同步的代码

2020-04-13 09:03 作者:小垃圾kiki  | 我要投稿
package cn.jd.syn;
/*
 * 取钱线程不安全
 */
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());  //发现有些数据丢掉了,显然是被覆盖了
    }
}


线程非同步的代码的评论 (共 条)

分享到微博请遵守国家法律