• synchronized默认的锁this(用在方法修饰符后面)

  • 如果要锁其他的内容要用synchronized块

  • 锁的对象是变化的量

package syn;
//数组
import java.util.ArrayList;

public class UnsafeList {
   public static void main(String[] args) throws InterruptedException {
       ArrayList<String> list = new ArrayList<String>();
       for (int i = 0; i < 10000; i++) {
           new Thread(()->{
               synchronized (list) {
                   list.add(Thread.currentThread().getName());
              }
          }).start();
      }
       Thread.sleep(3000);
       System.out.println(list.size());
  }
}
package syn;
//银行同时取钱,钱不够但是都取出了钱
public class UnsafeBank {


   public static void main(String[] args) {

   Account account = new Account(10000000,"第一桶金");
   Drawing you = new Drawing(account,50,"你");
   Drawing girlFriends = new Drawing(account,1000000,"你的对象");
   you.start();
   girlFriends.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;
          }
           //sleep可以放大问题的发生性
           try {
               Thread.sleep(1000);
          } 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);
      }
  }
}
package syn;

//不安全的买票
/*
线程不安全:
   1.有负数
*/

public class UnsafeBuyTicket {

   public static void main(String[] args) {

       BuyTicket buyTicket = new BuyTicket();

       new Thread(buyTicket,"小红").start();
       new Thread(buyTicket,"小华").start();
       new Thread(buyTicket,"黄牛").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(100);
       System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);
  }
}

 

posted @ 2021-04-09 16:01  术树  阅读(51)  评论(0)    收藏  举报