多线程---同步方法及同步块(解决线程不安全)
注意:锁的量是变化的量,需要增删改的对象
同步方法与同步代码块的区别:
同步方法:锁的粒度粗,执行效率低;
同步代码块:锁的粒度细,执行效率高;
三大不安全案例解决方案:
案例1(火车站买票)
package com.mokuiran.thread.synchronizedtest;
//不安全买票
//线程不安全,将会输出负数
public class UnsafeBuyTicket{
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
Thread thread1 = new Thread(buyTicket,"小明");
Thread thread2 = new Thread(buyTicket,"大明");
Thread thread3 = new Thread(buyTicket,"无明");
thread1.start();
thread2.start();
thread3.start();
}
}
class BuyTicket implements Runnable{
private int ticketNum = 10;//总票数
boolean flag = true;//外部停止方式
package com.mokuiran.thread.synchronizedtest;
//不安全的取钱
//两个人去银行取钱
public class UnsafeBank {
public static void main(String[] args) {
//账户
Account account = new Account(1000,"结婚基金");
Drawing you = new Drawing(account,50,"你");
Drawing grilFriend = new Drawing(account,100,"妻子");
you.start();
grilFriend.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;
}
//取钱