प्रौद्योगिकी साझेदारी

थ्रेड् सेफ्टी (2) समन्वयितस्य, ताला उन्नयनस्य, वस्तुस्मृतिसंरचनायाः च अन्तर्निहितः कार्यान्वयनसिद्धान्तः

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

विषयवस्तुसारणी

1. मूलभूतः प्रयोगः

  • कल्पयतु यत् एतादृशः परिदृश्यः अस्ति :२० उपयोक्तारः एकत्र १० टिकटं गृह्णन्ति

१.१ तालान् विना कोडस्य कार्यान्वयनम्

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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

अस्य परिणामाः : १.

भवन्तः द्रष्टुं शक्नुवन्ति यत् एतत् दृश्यते अतिविक्रयित समस्या , कुलम् १० टिकटानि सन्ति यदा २० सूत्राणि एकत्र टिकटं गृह्णन्ति तदा ११ जनाः टिकटं गृहीतवन्तः इति दृश्यते । यतो हि यदि द्वयोः सूत्रयोः if check एकस्मिन् समये पारितं भवति ।

अतः अस्माभिः टिकट-सञ्चालनं ताडयितुं आवश्यकं यत् केवलं एकः सूत्रः एव टिकट-कटौतीं एकस्मिन् समये परीक्षितुं संचालितुं च शक्नोति ।

१.२ कोड कार्यान्वयनस्य तालाबन्दी

public class TicketDemo {
   

    // 锁
    private static Object lock = new Object();

    // 票总数
    private int ticketNum = 10;

    /**
     * 抢票
     */
    public void getTicket() {
   
        synchronized (lock) {
   
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16