informasi kontak saya
Surat[email protected]
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();
}
}
}
Hasil dari:
Anda bisa melihatnya muncul masalah penjualan berlebih , total ada 10 tiket. Ketika 20 thread mengambil tiket bersama-sama, 11 orang tampaknya telah mengambil tiket tersebut. Ini karena jika kedua thread melewati pemeriksaan if secara bersamaan.
Oleh karena itu, kita perlu mengunci operasi tiket untuk memastikan bahwa hanya satu thread yang dapat memeriksa dan mengoperasikan pengurangan tiket pada saat yang bersamaan.
public class TicketDemo {
// 锁
private static Object lock = new Object();
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
synchronized (lock) {