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();
}
}
}
अस्य परिणामाः : १.
भवन्तः द्रष्टुं शक्नुवन्ति यत् एतत् दृश्यते अतिविक्रयित समस्या , कुलम् १० टिकटानि सन्ति यदा २० सूत्राणि एकत्र टिकटं गृह्णन्ति तदा ११ जनाः टिकटं गृहीतवन्तः इति दृश्यते । यतो हि यदि द्वयोः सूत्रयोः if check एकस्मिन् समये पारितं भवति ।
अतः अस्माभिः टिकट-सञ्चालनं ताडयितुं आवश्यकं यत् केवलं एकः सूत्रः एव टिकट-कटौतीं एकस्मिन् समये परीक्षितुं संचालितुं च शक्नोति ।
public class TicketDemo {
// 锁
private static Object lock = new Object();
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
synchronized (lock) {