多线程之同步方法及同步块

买票
 package com.yeyue.syn;
 
 //不安全的买票
 public class UnSafeBuyTicket {
     public static void main(String[] args) {
         BuyTicket ticket = new BuyTicket();
 
         new Thread(ticket,"可怜的我").start();
         new Thread(ticket,"厉害的你们").start();
         new Thread(ticket,"可恶的黄牛党").start();
 
    }
 
 }
 
 class BuyTicket implements Runnable{
 
     private int tickerNums = 10; //票数
     boolean flag = true; //标志位,用于停止线程
 
     @Override
     public void run() {
         while(flag){
             try {
                 buy();
            } catch (InterruptedException e) {
                 e.printStackTrace();
            }
        }
    }
     //synchronized 同步方法,锁的是this
     private synchronized void buy() throws InterruptedException {
         if (tickerNums<=0){
             flag = false; //停止线程
             return;
        }
         Thread.sleep(200); //模拟延时
         System.out.println(Thread.currentThread().getName()+"拿到了"+tickerNums--);
    }
 }
取钱
 package com.yeyue.syn;
 
 //不完全的取钱
 //两个人去银行取钱,账户,约
 public class UsafeBank {
 
     public static void main(String[] args) {
         Account account = new Account(100,"结婚基金");
 
         //你去取钱
         Drawing you = new Drawing(account,50,"你");
 
         //女朋友取钱
         Drawing girlfriend = new Drawing(account,100,"girlfriend");
 
         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;
 
     public Drawing(Account account,int drawingMoney,String name){
         super(name);
         this.account = account;
         this.drawingMoney = drawingMoney;
    }
 
     //取钱
     //synchronized默认锁的是this
     @Override
     public void run() {
 
         //锁的对象就是变化的量,需要增删改
         synchronized (account){
             //判断有没有钱
             if(account.money - drawingMoney < 0){
                 System.out.println(Thread.currentThread().getName()+"余额不足,取不了");
                 return;
            }
 
             //模拟延时,放大事件的发生性
             try {
                 Thread.sleep(2000);
            } catch (InterruptedException e) {
                 e.printStackTrace();
            }
 
             account.money = account.money - drawingMoney; //计算账户余额
 
             nowMoney = nowMoney + drawingMoney; //计算手中的钱
 
             System.out.println(account.name+"账户余额为: " + account.money);
 
             System.out.println(this.getName()+"手里的钱为: " + nowMoney);
        }
    }
 }
List
 package com.yeyue.syn;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class UnsefeList {
     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(1000);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }
         System.out.println(list.size());
    }
 }
 
测试JUC中安全类型的集合
 package com.yeyue.syn;
 
 import java.util.concurrent.CopyOnWriteArrayList;
 
 //测试JUC中安全类型的集合
 public class TestJuc {
     public static void main(String[] args) {
         CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
         for (int i = 0; i < 10000; i++) {
             new Thread(()->{
                 list.add(Thread.currentThread().getName());
            }).start();
        }
         try {
             Thread.sleep(1000);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }
         System.out.println(list.size());
    }
 }

 

posted @ 2021-06-29 14:53  深夜暗月  阅读(136)  评论(0)    收藏  举报