synchronized同步

package com.lei.syn;

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

//线程不安全集合
public class UnsafeList {
    public  static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        for (int i = 0; i < 10000; i++) {

               new Thread(()->{
                   synchronized(list){
                       list.add(Thread.currentThread().getName());
                   }

               }).start();

        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}


package com.lei.syn;

public class UnsafeBuyTicket {
    public static void main(String[] args) {
        BuyTicket buyTicket=new BuyTicket();

        new Thread(buyTicket,"A").start();
        new Thread(buyTicket,"B").start();
        new Thread(buyTicket,"C").start();
    }
    }


class BuyTicket implements Runnable{

    //票
    private int ticketNums=10;
    boolean flag=true;
    @Override
    public void run() {
        //买票
        while (flag){
            try {
                Buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //synchronized同步方法
    private synchronized void Buy() throws InterruptedException {
        if(ticketNums<=0){
            flag=false;
            return;
        }
        //模拟延时
        Thread.sleep(1000);

        //买票
        System.out.println(Thread.currentThread().getName()+"拿到第"+ticketNums--+"张票");
    }
}



package com.lei.syn;

public class UnsafeFeBand {
    public static void main(String[] args) {
        Account account = new Account(1000, "结婚基金");

        Drawing you = new Drawing(account,50,"你");
        Drawing girlfriend = new Drawing(account, 100, "女朋友");

        you.start();
        girlfriend.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 nowMoney;

    String name;

    public Drawing(Account account, int drawingMoney, String name){
        this.account=account;
        this.drawingMoney=drawingMoney;
        this.name=name;
    }

    //取钱
    @Override
    public  void run() {
      synchronized (account){
          //判断有没有钱
          if(account.money-drawingMoney<0){
              System.out.println(name + "钱不够,取不了");
              return;
          }

          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }

          //余额=余额-取钱
          account.money=account.money-drawingMoney;
          //手里的钱
          nowMoney=nowMoney+drawingMoney;

          System.out.println(account.name+"余额为:"+account.money);
          //Thread.currentThread().getName()=this.getName()因为继承了Thread
          System.out.println(name+"手里的钱"+nowMoney);
      }
    }
}

 

posted @ 2022-04-13 18:02  Eveeee  阅读(48)  评论(0)    收藏  举报