JavaRush /Blog Jawa /Random-JV /Tingkat 26. Wangsulan pitakonan wawancara babagan topik t...
zor07
tingkat
Санкт-Петербург

Tingkat 26. Wangsulan pitakonan wawancara babagan topik tingkat. Bagian 2. Pitakonan 6-9, 11-12

Diterbitake ing grup
Tingkat 26. Wangsulan pitakonan wawancara babagan topik tingkat.  Pérangan 2. Pitakonan 6-9, 11-12 - 1

6. Apa Kankarensi?

Concurrency minangka perpustakaan kelas ing Jawa sing ngemot kelas khusus sing dioptimalake kanggo nggarap macem-macem utas. Kelas iki diklumpukake ing paket java.util.concurrent. Padha bisa dipérang schematically miturut fungsi minangka nderek: Tingkat 26. Wangsulan pitakonan wawancara babagan topik tingkat.  Pérangan 2. Pitakonan 6-9, 11-12 - 2Koleksi bebarengan - pesawat saka koleksi sing bisa luwih irit ing lingkungan multi-Utas saka koleksi universal standar saka java.utilpaket. Tinimbang pambungkus dhasar Collections.synchronizedListkanthi ngalangi akses menyang kabeh koleksi, kunci segmen data digunakake, utawa karya dioptimalake kanggo maca data paralel nggunakake algoritma tanpa ngenteni. Antrian - antrian non-blocking lan mblokir kanthi dhukungan multi-threading. Antrian non-blocking dirancang kanggo kacepetan lan operasi tanpa ngalangi benang. Pamblokiran antrian digunakake nalika sampeyan kudu "alon mudhun" thread "Produser" utawa "Konsumen" yen sawetara kondisi ora ketemu, contone, antrian kosong utawa overflowed, utawa ora ana free "Konsumen". Sinkronisasi minangka utilitas tambahan kanggo nyinkronake benang. Padha gegaman kuat ing "podo" komputasi. Pelaksana - ngemot kerangka kerja sing apik kanggo nggawe kolam benang, jadwal tugas sing ora sinkron lan entuk asil. Kunci - nggambarake mekanisme sinkronisasi benang alternatif lan luwih fleksibel dibandhingake karo synchronizedsing waitdhasar notify. Atomics - kelas kanthi dhukungan kanggo operasi atom ing primitif lan referensi. Sumber:notifyAll

7. Kelas apa saka Kankarensi sing sampeyan ngerti?

Wangsulan kanggo pitakonan iki wis diterangake kanthi sampurna ing artikel iki . Aku ora weruh titik kanggo nyetak kabeh ing kene, mula aku mung bakal menehi katrangan babagan kelas-kelas sing dakkenal kanthi sedhela. ConcurrentHashMap<K, V> - Ora kaya Hashtablelan pamblokiran synhronizeding HashMap, data ditampilake ing wangun segmen, dipérang dadi hash saka tombol. Akibaté, data diakses dening segmen tinimbang obyek siji. Kajaba iku, iterator makili data kanggo wektu tartamtu lan ora uncalan ConcurrentModificationException. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray - Apa yen ing kelas sampeyan kudu nyinkronake akses menyang siji variabel prasaja saka jinis int? Sampeyan bisa nggunakake mbangun karo synchronized, lan nalika nggunakake operasi atom set/get, volatile. Nanging sampeyan bisa nindakake luwih apik kanthi nggunakake kelas anyar Atomic*. Amarga nggunakake CAS, operasi karo kelas kasebut luwih cepet tinimbang yen disinkronake liwat synchronized/volatile. Kajaba iku, ana cara kanggo nambah atom kanthi jumlah tartamtu, uga nambah / nyuda.

8. Kepiye cara kelas ConcurrentHashMap?

Nalika diluncurake, ConcurrentHashMappangembang Java mbutuhake implementasi peta hash ing ngisor iki:
  • Keamanan thread
  • Ora ana kunci ing kabeh meja nalika ngakses
  • Iku seng di pengeni sing ora ana kunci meja nalika nindakake operasi maca
Ide implementasi utama ConcurrentHashMapyaiku:
  1. Unsur peta

    Ora kaya unsur HashMap, Entrying ConcurrentHashMapdiumumake minangka volatile. Iki minangka fitur penting, uga amarga owah-owahan ing 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. Fungsi hash

    ConcurrentHashMapfungsi hashing apik uga digunakake.

    Ayo kula ngelingake sampeyan kaya ing HashMapJDK 1.2:

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

    Versi saka 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);
    }

    Napa ana perlu kanggo nggawe fungsi hash luwih rumit? Tabel ing peta hash duwe dawa sing ditemtokake dening daya loro. Kanggo kode hash sing perwakilan binar ora beda-beda ing posisi sing kurang lan dhuwur, kita bakal ngalami tabrakan. Nambah kerumitan fungsi hash mung ngrampungake masalah iki, nyuda kemungkinan tabrakan ing peta.

  3. Segmen

    Peta iki dipérang dadi N segmen beda (16 minangka standar, nilai maksimum bisa 16 bit lan daya saka loro). Saben bagean minangka tabel unsur peta sing aman kanggo benang. Nambah jumlah segmen bakal nyengkuyung operasi modifikasi kanggo mbentang sawetara segmen, nyuda kemungkinan pamblokiran nalika runtime.

  4. Tingkat Konkurensi

    Parameter iki mengaruhi panggunaan kertu memori lan jumlah segmen ing kertu.

    Jumlah segmen bakal dipilih minangka daya paling cedhak saka loro luwih saka concurrencyLevel. Mudhunake concurrencyLevel ndadekake luwih akeh benang bakal mblokir segmen peta nalika nulis. Overestimation saka indikator nyebabake panggunaan memori sing ora efisien. Yen mung siji utas sing bakal ngowahi peta, lan liyane bakal maca, disaranake nggunakake nilai 1.

  5. Total

    Dadi, kaluwihan utama lan fitur implementasine ConcurrentHashMap:

    • hashmapPeta nduweni antarmuka interaksi sing padha karo
    • Operasi maca ora mbutuhake kunci lan ditindakake kanthi paralel
    • Operasi nulis asring uga bisa ditindakake kanthi paralel tanpa diblokir
    • Nalika nggawe, sing dibutuhake dituduhake concurrencyLevel, ditemtokake kanthi maca lan nulis statistik
    • Unsur peta nduweni nilai valuesing diumumake minangkavolatile
    Sumber: Cara Kerja ConcurrentHashMap

9. Apa kelas Lock?

Kanggo ngontrol akses menyang sumber daya sing dienggo bareng, kita bisa nggunakake kunci minangka alternatif kanggo operator sing disinkronake. Fungsi ngunci dikemas ing java.util.concurrent.locks. Kaping pisanan, utas nyoba ngakses sumber daya sing dienggo bareng. Yen gratis, banjur kunci dipasang ing benang. Sawise karya rampung, kunci ing sumber daya sing dienggo bareng bakal dirilis. Yen sumber daya ora gratis lan kunci wis diselehake ing, banjur thread ngenteni nganti kunci iki dirilis. Kelas kunci ngleksanakake antarmuka Locksing nemtokake cara ing ngisor iki:
  • void lock():ngenteni nganti kunci angsal
  • boolean tryLock():nyoba kanggo ndarbeni kunci; yen kunci dipikolehi, bakal bali bener . Yen kunci ora dipikolehi, bakal bali palsu . Ora kaya cara, lock()ora ngenteni entuk kunci yen ora kasedhiya
  • void unlock():mbusak kunci
  • Condition newCondition():ngasilake obyek Conditionsing digandhengake karo kunci saiki
Organisasi ngunci ing kasus umum cukup prasaja: kanggo entuk kunci, cara kasebut diarani lock(), lan sawise rampung nggarap sumber daya sing dienggo bareng, metode kasebut diarani unlock(), sing ngeculake kunci. Objek kasebut Conditionngidini sampeyan ngatur pamblokiran. Minangka aturan, kanggo nggarap kunci, kelas ReentrantLocksaka paket digunakake. java.util.concurrent.locks.Kelas iki ngetrapake antarmuka Lock. Ayo kang katon ing nggunakake API Kunci Jawa nggunakake program cilik minangka conto: Dadi, ayo kang ngomong kita duwe kelas Resourcekaro sawetara cara thread-aman lan cara ngendi safety thread ora dibutuhake.
public class Resource {

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

    public void doLogging(){
        // потокобезопасность для логгирования нам не требуется
    }
}
Saiki ayo njupuk kelas sing ngetrapake antarmuka Runnablelan nggunakake metode kelas 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();
    }
}
Saiki ayo nulis ulang program ing ndhuwur nggunakake API Kunci tinimbang 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();
    }

}
Nalika sampeyan bisa ndeleng saka program, kita nggunakake cara tryLock()kanggo mesthekake yen thread mung ngenteni sawetara wektu. Yen ora entuk kunci ing obyek kasebut, mung log lan metu. Titik penting liyane. Sampeyan kudu nggunakake pemblokiran try-finallykanggo mesthekake yen kunci bakal dirilis sanajan cara doSomething()mbalang pangecualian. Sumber:

11. Apa iku mutex?

Mutex minangka obyek khusus kanggo nyinkronake benang / proses. Bisa njupuk rong negara - sibuk lan gratis. Kanggo nyederhanakake, mutex minangka variabel boolean sing njupuk rong nilai: sibuk (bener) lan gratis (palsu). Nalika thread pengin kepemilikan eksklusif saka obyek, iku nandhani mutex minangka sibuk, lan yen wis rampung nggarap iku, tandha mutex minangka free. Mutex ditempelake ing saben obyek ing Jawa. Mung mesin Java duwe akses langsung menyang mutex. Iku didhelikake saka programmer.

12. Apa iku monitor?

Monitor minangka mekanisme khusus (potongan kode) - tambahan ing mutex, sing njamin operasi sing bener. Sawise kabeh, ora cukup kanggo menehi tandha manawa obyek kasebut sibuk; kita uga kudu mesthekake yen benang liyane ora nyoba nggunakake obyek sing sibuk. Ing Jawa, monitor diimplementasikake nggunakake tembung kunci synchronized. Nalika nulis blok sing disinkronake, compiler Java ngganti karo telung potongan kode:
  1. Ing wiwitan pamblokiran synchronized, kode ditambahake sing nandhani mutex minangka sibuk.
  2. Ing pungkasan blok, synchronizedkode ditambahake sing menehi tandha mutex minangka gratis.
  3. Sadurunge pemblokiran, synchronizedkode ditambahake sing mriksa yen mutex sibuk, banjur thread kudu ngenteni kanggo dirilis.
Bagean 1
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION