JavaRush /جاوا بلاگ /Random-SD /سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب. حصو 2. سو...
zor07
سطح
Санкт-Петербург

سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب. حصو 2. سوال 6-9، 11-12

گروپ ۾ شايع ٿيل
سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب.  حصو 2. سوال 6-9، 11-12 - 1

6. Cancarenzi ڇا آهي؟

Concurrency جاوا ۾ هڪ ڪلاس لائبريري آهي جنهن ۾ خاص ڪلاس شامل آهن ڪيترن ئي موضوعن تي ڪم ڪرڻ لاءِ بهتر ڪيل. اهي ڪلاس هڪ پيڪيج ۾ گڏ ڪيا ويا آهن java.util.concurrent. انهن کي اسڪيمياتي طور تي ورهائي سگهجي ٿو ڪارڪردگي جي مطابق هن ريت: سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب.  حصو 2. سوال 6-9، 11-12 - 2سمورو مجموعوjava.util - مجموعن جو هڪ سيٽ جيڪو پيڪيج مان معياري عالمگير مجموعن جي ڀيٽ ۾ گھڻن موضوعن واري ماحول ۾ وڌيڪ ڪارائتو ڪم ڪري ٿو . مڪمل مجموعي تائين رسائي کي بلاڪ ڪرڻ سان گڏ بنيادي لفافي جي بدران Collections.synchronizedList، ڊيٽا حصن تي تالا استعمال ڪيا ويا آهن، يا انتظار کان آزاد الگورتھم استعمال ڪندي ڊيٽا جي متوازي پڙهڻ لاء ڪم کي بهتر ڪيو ويو آهي. قطارون - غير بلاڪنگ ۽ بلاڪنگ قطارون ملٽي ٿريڊنگ سپورٽ سان. غير بلاڪ ڪرڻ واريون قطارون ٺهيل آهن رفتار ۽ آپريشن لاءِ بغير بلاڪ ڪرڻ واري سلسلي جي. بلاڪنگ قطارون استعمال ڪيون وينديون آھن جڏھن توھان کي ”سست“ ڪرڻ جي ضرورت پوندي ”پيداوار“ يا ”صارف“ جي سلسلي کي جيڪڏھن ڪجھ شرط پورا نه ڪيا ويا آھن، مثال طور، قطار خالي آھي يا اوور فلو آھي، يا ڪو مفت ”صارف“ نه آھي. هم وقت سازي سلسلي کي هم وقت سازي ڪرڻ لاء مددگار افاديت آهن. اهي "متوازي" ڪمپيوٽنگ ۾ هڪ طاقتور هٿيار آهن. ايگزيڪيوٽرز - ٿريڊ پول ٺاهڻ لاءِ بهترين فريم ورڪ تي مشتمل آهي، غير مطابقت واري ڪمن کي شيڊول ڪرڻ ۽ نتيجا حاصل ڪرڻ. Locks - بنيادي synchronizedشين جي مقابلي ۾ متبادل ۽ وڌيڪ لچڪدار ٿريڊ سنڪرونائيزيشن ميڪانيزم جي نمائندگي ڪري ٿو . Atomics - طبقن جي مدد سان ايٽمي عملن لاءِ پرائمري ۽ حوالن تي. ذريعو:waitnotifynotifyAll

7. ڪهڙن طبقن کان ڪنڪرنسي توهان کي خبر آهي؟

هن سوال جو جواب مڪمل طور تي هن مضمون ۾ بيان ڪيو ويو آهي . مون کي هتي اهو سڀ ڪجهه ٻيهر ڇپائڻ جو مقصد نظر نٿو اچي، تنهن ڪري مان صرف انهن طبقن جي وضاحت ڪندس جن سان مون کي مختصر طور تي واقفيت جو اعزاز حاصل آهي. ConcurrentHashMap<K, V> - ان جي برعڪس Hashtable۽ بلاڪ synhronizedتي HashMap، ڊيٽا حصن جي صورت ۾ پيش ڪئي وئي آهي، ورهايل چاٻين جي هيش ۾. نتيجي طور، ڊيٽا ھڪڙي اعتراض جي بجاء حصن جي ذريعي پھچايو ويندو آھي. ان کان علاوه، آئٽرٽر هڪ مخصوص عرصي لاءِ ڊيٽا جي نمائندگي ڪن ٿا ۽ اڇلائي نٿا وڃن ConcurrentModificationException. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray - ڇا جيڪڏھن ڪنھن طبقي ۾ توھان کي ھڪڙي قسم جي سادي متغير تائين رسائي کي هم وقت سازي ڪرڻ جي ضرورت آھي int؟ توھان استعمال ڪري سگھوٿا تعميرات سان synchronized، ۽ جڏھن ايٽمي عملن کي استعمال ڪندي set/get، volatile. پر توهان نوان ڪلاس استعمال ڪندي اڃا به بهتر ڪري سگهو ٿا Atomic*. CAS جي استعمال جي ڪري، انهن طبقن سان آپريشن تيزيءَ سان ٿئي ٿو جيڪڏهن ان ذريعي هم وقت سازي ڪئي وڃي synchronized/volatile. ان سان گڏ، هڪ ڏنل رقم جي ذريعي ايٽمي اضافو لاء طريقا آهن، انهي سان گڏ واڌ / گهٽتائي.

8. ConcurrentHashMap ڪلاس ڪيئن ڪم ڪندو آهي؟

ان جي تعارف جي وقت تائين، ConcurrentHashMapجاوا ڊولپرز کي هيٺين هيش نقشي تي عمل ڪرڻ جي ضرورت هئي:
  • تار جي حفاظت
  • ان تائين رسائي ڪرڻ دوران پوري ٽيبل تي ڪوبه تالو نه آهي
  • اهو ضروري آهي ته ڪو به ٽيبل لاڪ نه آهن جڏهن پڙهڻ واري آپريشن کي انجام ڏيو
مکيه عمل درآمد جا خيال ConcurrentHashMapهن ريت آهن:
  1. نقشي جا عنصر

    عناصر جي برعڪس HashMap، Entry۾ ConcurrentHashMapقرار ڏنو ويو آهي volatile. هي هڪ اهم خصوصيت آهي، پڻ JMM ۾ تبديلين جي ڪري .

    static final class HashEntry<K, V> {
        final K key;
        final int hash;
        volatile V value;
        final HashEntry<K, V> next;
    
        HashEntry(K key, int hash, HashEntry<K, V> next, V value) {
            this .key = key;
            this .hash = hash;
            this .next = next;
            this .value = value;
         }
    
        @SuppressWarnings("unchecked")
        static final <K, V> HashEntry<K, V>[] newArray(int i) {
            return new HashEntry[i];
        }
    }
  2. هاش فنڪشن

    ConcurrentHashMapهڪ بهتر هيشنگ فنڪشن پڻ استعمال ڪيو ويندو آهي.

    HashMapاچو ته توهان کي ياد ڏياريان ته اهو JDK 1.2 ۾ ڇا هو :

    static int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

    ConcurrentHashMap JDK 1.5 کان نسخو:

    private static int hash(int h) {
        h += (h << 15) ^ 0xffffcd7d;
        h ^= (h >>> 10);
        h += (h << 3);
        h ^= (h >>> 6);
        h += (h << 2) + (h << 14);
        return h ^ (h >>> 16);
    }

    هيش فنڪشن کي وڌيڪ پيچيده بڻائڻ جي ضرورت ڇو آهي؟ هيش نقشي ۾ جدولن جي ڊيگهه ٻن جي طاقت سان طئي ٿيل آهي. هيش ڪوڊس لاءِ جن جي بائنري نمائندگي گهٽ ۽ اعليٰ پوزيشن ۾ مختلف ناهيون، اسان وٽ ٽڪراءُ هوندو. هيش فنڪشن جي پيچيدگي کي وڌائڻ صرف هن مسئلي کي حل ڪري ٿو، نقشي ۾ ٽڪراء جي امڪان کي گھٽائي ٿو.

  3. ڀاڱا

    نقشو N مختلف حصن ۾ ورهايل آھي (ڊفالٽ طور 16، وڌ ۾ وڌ قدر 16 بٽ ٿي سگھي ٿو ۽ ٻن جي طاقت آھي). هر ڀاڱو نقشي جي عنصرن جو هڪ سلسلي-محفوظ جدول آهي. حصن جي تعداد کي وڌائڻ سان ترميمي عملن جي حوصلا افزائي ڪئي ويندي ڪيترن ئي حصن کي وڌائڻ لاءِ، رن ٽائم تي بلاڪ ٿيڻ جي امڪان کي گھٽائيندي.

  4. اتفاق جي سطح

    هي پيٽرول ميموري ڪارڊ جي استعمال ۽ ڪارڊ ۾ حصن جي تعداد کي متاثر ڪري ٿو.

    حصن جو تعداد چونڊيو ويندو ويجھي طاقت جي طور تي ٻن کان وڌيڪ concurrencyLevel. ConcurrencyLevel کي گهٽ ڪرڻ سان اهو وڌيڪ امڪان آهي ته ٿريڊز نقشي جي حصن کي بلاڪ ڪندا جڏهن لکندا. اشاري جي حد کان وڌيڪ ميموري جي غير موثر استعمال جي ڪري ٿي. جيڪڏهن صرف هڪ ڌاڳو نقشي کي تبديل ڪندو، ۽ باقي پڙهندو، اها صلاح ڏني وئي آهي ته قيمت 1 استعمال ڪريو.

  5. ڪُل

    تنهن ڪري، مکيه فائدن ۽ عملدرآمد خاصيتون ConcurrentHashMap:

    • نقشي سان ملندڙ hashmapجلندڙ انٽرفيس آھي
    • پڙهڻ جي عملن کي تالا جي ضرورت نه هوندي آهي ۽ متوازي طور تي انجام ڏنو ويندو آهي
    • لکڻ جا عمل اڪثر ڪري سگھن ٿا متوازي ۾ بغير بلاڪ ڪرڻ جي
    • جڏهن ٺاھڻ، گهربل ھڪڙو اشارو ڪيو ويو آھي concurrencyLevel، پڙھڻ ۽ لکڻ جي انگن اکرن سان طئي ڪيو ويو آھي
    • نقشي جي عناصرن کي ھڪڙي قدر valueقرار ڏنو ويو آھيvolatile
    ذريعو: ڪئين ڪنورنٽ هش ميپ ڪم ڪندو آهي

9. لاک ڪلاس ڇا آهي؟

گڏيل وسيلن تائين رسائي کي ڪنٽرول ڪرڻ لاءِ، اسان لاڪ استعمال ڪري سگهون ٿا متبادل طور تي هم وقت ساز آپريٽر جي. تالا لڳائڻ جي ڪارڪردگي ۾ پيڪيج ٿيل آهي java.util.concurrent.locks. پهريون، موضوع گڏيل وسيلن تائين رسائي جي ڪوشش ڪري ٿو. جيڪڏهن اهو مفت آهي، ته پوء هڪ تالا ڌاڳو تي رکيل آهي. هڪ دفعو ڪم مڪمل ٿيڻ بعد، گڏيل وسيلن تي تالا جاري ڪيو ويو آهي. جيڪڏهن وسيلو مفت نه آهي ۽ ان تي هڪ تالا اڳ ۾ ئي رکيل آهي، پوء اهو سلسلو انتظار ڪري ٿو جيستائين هي تالا آزاد نه ٿئي. لاڪ ڪلاس هڪ انٽرفيس کي لاڳو ڪري ٿو Lockجيڪو هيٺين طريقن کي بيان ڪري ٿو:
  • void lock():لاڪ حاصل ڪرڻ تائين انتظار ڪري ٿو
  • boolean tryLock():تالو حاصل ڪرڻ جي ڪوشش ڪري ٿو؛ جيڪڏهن تالا حاصل ڪيو وڃي، اهو صحيح آهي . جيڪڏهن تالا حاصل نه ڪيو ويو آهي، اهو غلط آهي . طريقي جي برعڪس، lock()اهو هڪ تالا حاصل ڪرڻ جو انتظار نٿو ڪري جيڪڏهن هڪ دستياب ناهي
  • void unlock():تالا هٽائي ٿو
  • Condition newCondition():اهو اعتراض واپس ڏئي ٿو Conditionجيڪو موجوده تالا سان لاڳاپيل آهي
عام صورت ۾ تالا لڳائڻ جي جوڙجڪ بلڪل سادو آهي: تالا حاصل ڪرڻ لاء، طريقو سڏيو ويندو آهي lock()، ۽ گڏيل وسيلن سان ڪم ڪرڻ کان پوء، طريقو سڏيو ويندو آهي unlock()، جيڪو تالا جاري ڪري ٿو. اعتراض Conditionتوهان کي بلاڪنگ کي منظم ڪرڻ جي اجازت ڏئي ٿو. ضابطي جي طور تي، لاڪ سان ڪم ڪرڻ لاء، ReentrantLockپيڪيج مان هڪ ڪلاس استعمال ڪيو ويندو آهي. java.util.concurrent.locks.هي ڪلاس انٽرفيس کي لاڳو ڪري ٿو Lock. اچو ته ڏسو جاوا لاک API استعمال ڪندي هڪ ننڍڙو پروگرام مثال طور استعمال ڪندي: سو، اچو ته چئون ته اسان وٽ هڪ ڪلاس آهي Resourceجنهن ۾ ڪجهه ٿريڊ محفوظ طريقا ۽ طريقا آهن جتي ٿريڊ جي حفاظت جي ضرورت ناهي.
public class Resource {

    public void doSomething(){
        // пусть здесь происходит работа с базой данных
    }

    public void doLogging(){
        // потокобезопасность для логгирования нам не требуется
    }
}
هاڻي اچو ته هڪ ڪلاس وٺون جيڪو انٽرفيس کي لاڳو ڪري Runnable۽ ڪلاس جا طريقا استعمال ڪري Resource.
public class SynchronizedLockExample implements Runnable{

    // экземпляр класса Resource для работы с методами
    private Resource resource;

    public SynchronizedLockExample(Resource r){
        this.resource = r;
    }

    @Override
    public void run() {
        synchronized (resource) {
            resource.doSomething();
        }
        resource.doLogging();
    }
}
هاڻي اچو ته مٿي ڏنل پروگرام کي ٻيهر لکون Lock API جي بدران synchronized.
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

// класс для работы с Lock API. Переписан с приведенной выше программы,
// но уже без использования ключевого слова synchronized
public class ConcurrencyLockExample implements Runnable{

    private Resource resource;
    private Lock lock;

    public ConcurrencyLockExample(Resource r){
        this.resource = r;
        this.lock = new ReentrantLock();
    }

    @Override
    public void run() {
        try {
            // лочим на 10 секунд
            if(lock.tryLock(10, TimeUnit.SECONDS)){
            resource.doSomething();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            //убираем лок
            lock.unlock();
        }
        // Для логгирования не требуется потокобезопасность
        resource.doLogging();
    }

}
جئين توهان پروگرام مان ڏسي سگهو ٿا، اسان اهو طريقو استعمال ڪندا آهيون tryLock()انهي کي يقيني بڻائڻ لاء ته موضوع صرف هڪ خاص وقت تائين انتظار ڪري ٿو. جيڪڏهن اهو اعتراض تي تالا حاصل نٿو ڪري، اهو صرف لاگ ان ۽ نڪرندو آهي. ٻيو اهم نقطو. توهان کي هڪ بلاڪ استعمال ڪرڻ گهرجي try-finallyانهي کي يقيني بڻائڻ لاءِ ته تالا جاري ڪيو ويندو جيتوڻيڪ طريقو doSomething()هڪ استثنا ڏئي ٿو. ذريعن:

11. ميوٽيڪس ڇا آهي؟

هڪ ميوٽڪس هڪ خاص اعتراض آهي هم وقت سازي لاءِ ٿريڊز/پروسيسز. اهو ٻه رياستون وٺي سگھي ٿو - مصروف ۽ آزاد. آسان ڪرڻ لاء، هڪ ميوٽڪس هڪ بوليان متغير آهي جيڪو ٻه قدر وٺندو آهي: مصروف (سچو) ۽ مفت (غلط). جڏهن هڪ ڌاڳو ڪنهن شئي جي خاص ملڪيت چاهي ٿو، اهو پنهنجي ميٽيڪس کي مصروف طور تي نشان لڳائي ٿو، ۽ جڏهن اهو ان سان ڪم ڪري چڪو آهي، اهو پنهنجي ميوٽڪس کي مفت طور نشان لڳايو آهي. هڪ ميوٽڪس جاوا ۾ هر شئي سان ڳنڍيل آهي. صرف جاوا مشين کي ميوٽڪس تائين سڌو رسائي آهي. اهو پروگرامر کان لڪيل آهي.

12. مانيٽر ڇا آهي؟

مانيٽر هڪ خاص ميکانيزم آهي (ڪوڊ جو هڪ ٽڪرو) - ميوٽڪس مٿان هڪ اضافو، جيڪو ان سان صحيح آپريشن کي يقيني بڻائي ٿو. سڀ کان پوء، اهو نشان لڳائڻ ڪافي ناهي ته اعتراض مصروف آهي؛ اسان کي اهو پڻ يقيني بڻائڻ گهرجي ته ٻيا موضوع مصروف اعتراض استعمال ڪرڻ جي ڪوشش نه ڪن. جاوا ۾، مانيٽر لفظ استعمال ڪندي لاڳو ڪيو ويو آهي synchronized. جڏهن اسان هڪ هم وقت ساز بلاڪ لکندا آهيون، جاوا ڪمپلر ان کي ڪوڊ جي ٽن ٽڪرن سان تبديل ڪري ٿو:
  1. بلاڪ جي شروعات ۾ synchronized، ڪوڊ شامل ڪيو ويو آھي جيڪو ميوٽڪس کي مصروف طور نشان لڳايو.
  2. بلاڪ جي آخر ۾، synchronizedھڪڙو ڪوڊ شامل ڪيو ويو آھي جيڪو نشان لڳندو آھي ميوٽڪس کي مفت طور.
  3. بلاڪ کان اڳ، synchronizedڪوڊ شامل ڪيو ويو آهي ته چيڪ ڪري ٿو ته ميوٽڪس مصروف آهي، پوء موضوع کي ان جي ڇڏڻ جو انتظار ڪرڻو پوندو.
حصو 1
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION