线程不安全代码示例
- 当出现多个线程操作同一个对象的时候,如果不加以控制,则会出现错误的情况。
- 这里举两个例子,一个是抢票,一个是取钱。
一、抢票
UnsafeBuyTicket.java
多个人抢票,出现两个人抢到了同一张票的情况
package com.peng.sync;
public class UnsafeBuyTicket{
public static void main(String[] args) {
BuyTicket ticket = new BuyTicket(10);
new Thread(ticket,"小明").start();
new Thread(ticket, "老师").start();
new Thread(ticket, "黄牛").start();
}
}
class BuyTicket implements Runnable{
private int ticketNum;
private boolean flag = true;
public BuyTicket(int ticketNum){
this.ticketNum = ticketNum;
}
@Override
public void run() {
while (flag){
buy();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void buy(){
if (ticketNum <= 0){
flag = false;
return;
}
else{
System.out.println(Thread.currentThread().getName() + "抢到了票" + ticketNum--);
}
}
}
二、银行取钱
UnsafeBank.java
两个人同时从一个账户中取钱,账户余额变为负数
package com.peng.sync;
public class UnsafeBank {
public static void main(String[] args) {
Account abc = new Account("abc", 10000);
Drawing handsome = new Drawing(abc, 5000);
Drawing girlfriend = new Drawing(abc, 7000);
new Thread(handsome,"大帅哥").start();
new Thread(girlfriend, "女朋友").start();
}
}
class Account{
String accountName;
int money;
public Account(String accountName, int money){
this.accountName = accountName;
this.money = money;
}
}
class Drawing implements Runnable{
Account account;
int drawedMoney;
public Drawing(Account a, int d){
account = a;
drawedMoney = d;
}
@Override
public void run() {
if (account.money - drawedMoney <= 0){
System.out.println("账户余额不足了");
return;
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.money = account.money - drawedMoney;
System.out.println(Thread.currentThread().getName() + "取了" + drawedMoney + "钱");
System.out.println("账户余额为:" + account.money);
}
}