synchronized解决三大不安全案例
1.UnsafeTicket
测试代码如下:
public class UnsafeTicket {
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;
boolean flag = true;
@Override
public void run() {
while(flag){
try {
Thread.sleep(100);
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void buy(){//synchronized同步方法
if(ticketNum<=0){
flag = false;
return;
}
System.out.println(Thread.currentThread().getName()+"拿到了"+ticketNum--);
}
}
运行结果如下:
老板拿到了10
小明拿到了9
黄牛拿到了8
老板拿到了7
黄牛拿到了6
小明拿到了5
小明拿到了4
老板拿到了3
黄牛拿到了2
黄牛拿到了1
进程已结束,退出代码 0
UnsafeBank
测试代码如下:
public class UnsafeBank {
public static void main(String[] args) {
Account account = new Account(100, "结婚基金");
Bank you = new Bank(account, 50, "你");
Bank girlFriend = new Bank(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 Bank extends Thread{
Account account;
int consumeMoney; //取了多少钱
int nowMoney; //现在还有多少钱
public Bank(Account account,int consumeMoney,String name){
super(name);
this.account = account;
this.consumeMoney = consumeMoney;
}
@Override
public void run() {
synchronized (account){
//判断有没有钱
if(account.money-consumeMoney<0){
System.out.println(Thread.currentThread().getName()+"取不了,钱不够");
return;
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.money = account.money - consumeMoney;
nowMoney = nowMoney + consumeMoney;
System.out.println(account.name+"余额为:"+account.money);
System.out.println(this.getName()+"手里的钱"+nowMoney);
}
}
}
运行结果如下:
结婚基金余额为:50
你手里的钱50
女朋友取不了,钱不够
进程已结束,退出代码 0
3.UnsafeList
测试代码如下:
public class UnsafeList {
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
new Thread(()->{
synchronized (list){
list.add(Thread.currentThread().getName());
}
}).start();
}
Thread.sleep(1000);
System.out.println(list.size());
}
}
运行结果如下:
1000
进程已结束,退出代码 0