线程不安全例子

并发:同一个对象被多个线程同时操作

 

不安全抢票

查看代码
package com.lei.syn;
public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket buyTicket=new BuyTicket();
new Thread(buyTicket,"A").start();
new Thread(buyTicket,"B").start();
new Thread(buyTicket,"C").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();
}
}
}
private void Buy() throws InterruptedException {
if(ticketNums<=0){
flag=false;
return;
}
//模拟延时
Thread.sleep(1000);
//买票
System.out.println(Thread.currentThread().getName()+"拿到第"+ticketNums--+"张票");
}
}

不安全银行取钱

查看代码
package com.lei.syn;
public class UnsafeFeBand {
public static void main(String[] args) {
Account account = new Account(100, "结婚基金");
Drawing you = new Drawing(account,50,"你");
Drawing girlfriend = new Drawing(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 Drawing extends Thread{
Account account;//账户
//取了多少钱
int drawingMoney;
//现在手里多少钱
int nowMoney;
String name;
public Drawing(Account account, int drawingMoney, String name){
this.account=account;
this.drawingMoney=drawingMoney;
this.name=name;
}
//取钱
@Override
public void run() {
//判断有没有钱
if(account.money-drawingMoney<0){
System.out.println(name + "钱不够,取不了");
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//余额=余额-取钱
account.money=account.money-drawingMoney;
//手里的钱
nowMoney=nowMoney+drawingMoney;
System.out.println(account.name+"余额为:"+account.money);
//Thread.currentThread().getName()=this.getName()因为继承了Thread
System.out.println(name+"手里的钱"+nowMoney);
}
}

同一时间被添加进去,线程不安全
package com.lei.syn;
import java.util.ArrayList;
import java.util.List;
//线程不安全集合
public class UnsafeList {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
for (int i = 0; i < 10000; i++) {
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}

posted @   Eveeee  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示