强调!!! 使用synchronized 最好放在公共使用的方法或变量
第一种作为修饰符修饰方法
package org.example.sync;
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 ticketNum = 10;
private Boolean flag = true;
@Override
public void run() {
while (flag){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
buy();
}
}
public synchronized void buy(){
if(ticketNum<=0){
flag = false;
return;
}
System.out.println(Thread.currentThread().getName()+"买到票"+ticketNum--);
}
}
第二种作为代码块方法
public class UnsaftBank {
public static void main(String[] args) {
Account account = new Account(100);
new Drawing(account,100,"王女士").start();
new Drawing(account,50,"张先生").start();
}
}
class Account{
int money;
public Account(int money) {
this.money = money;
}
}
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;
}
@Override
public void run() {
synchronized(account){
if(account.money-drawingMoney<0){
System.out.println("账户钱不足");
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
account.money = account.money-drawingMoney;
nowMoney=nowMoney+drawingMoney;
System.out.println("账户还有"+account.money);
System.out.println(this.getName()+"拿到"+nowMoney);
}
}
}