2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
public class TicketDemo {
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
if (ticketNum <= 0) {
return;
}
System.out.println(Thread.currentThread().getName() + " 抢到一张票,剩余:" + ticketNum);
// 非原子性操作
ticketNum--;
}
/**
* 测试:20个人抢一张票
*/
public static void main(String[] args) {
TicketDemo ticketDemo = new TicketDemo();
for (int i = 0; i < 20; i++) {
new Thread(ticketDemo::getTicket).start();
}
}
}
Ergebnisse der:
Sie können sehen, dass es erscheint Überverkauftes Problem , es gibt insgesamt 10 Tickets. Wenn 20 Threads zusammen Tickets ergattern, scheinen 11 Personen die Tickets ergattert zu haben. Dies liegt daran, dass beide Threads die IF-Prüfung gleichzeitig bestehen.
Daher müssen wir den Ticketvorgang sperren, um sicherzustellen, dass nur ein Thread gleichzeitig den Ticketabzug prüfen und ausführen kann.
public class TicketDemo {
// 锁
private static Object lock = new Object();
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
synchronized (lock) {