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

java中线程同步块的代码

2020-04-13 17:24 作者:小垃圾kiki  | 我要投稿
package cn.jd.syn;
/*
 * 取钱线程安全
 */
public class SynBlockTest01 {
    public static void main(String[] args) {
        //账户
        Account account=new Account(1000,"结婚礼金");
        SynDrawing you=new SynDrawing(account,80,"可悲的你");
        SynDrawing wife=new SynDrawing(account,90,"happy的她");
        you.start();
        wife.start();
        
    }
}

//模拟取款
class SynDrawing extends Thread{
    Account account;//取钱的账户
    int drawingMoney;//取的钱数
    int packetTotal;//口袋的钱
    
    public SynDrawing(Account account, int drawingMoney,String name) {
        super(name);
        this.account = account;
        this.drawingMoney = drawingMoney;
    }

    @Override
    public void run() {
        test();
    }
    //目标锁定account
    public  void test() {
        //提高性能
        if(account.money<=0) {
            return;
        }
        synchronized(account) {
            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;

import java.util.ArrayList;
import java.util.List;

/*
 * 取钱线程不安全
 * 操作容器
 */
public class SynBlockTest02 {
    public static void main(String[] args) throws InterruptedException {
        List<String> list=new ArrayList<String>();
        for(int i=0;i<10000;i++) {
            new Thread(()->{
                //同步块
                synchronized(list) {
                    list.add(Thread.currentThread().getName());
                }
                
            }).start();
        }
        //让主线程延时1秒,害怕线程没有运行完成,主线程就执行完毕了
        Thread.sleep(1000);
        System.out.println(list.size());  //发现有些数据丢掉了,显然是被覆盖了
    }
}


java中线程同步块的代码的评论 (共 条)

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