Java Semaphore ve Mutex nedir – Java Concurrency MultiThread Örnek ile açıklanmıştır

Yayınlanan: 2015-03-12

Crunchify'dan Java Mutex ve Semafor Eğitimi

Java Eşzamanlılığı çok geniş bir konudur. Kullanmak için yüzlerce öğretici ve örnek mevcuttur. Bir süre önce Java'da Aynı Anda Birden Çok İş Parçacığı Çalıştırma ve farklı Senkronize Blok türleri hakkında birkaç ders yazdım.

Bu eğitimde şunları ele alacağız:

  1. Mutex'in Açıklaması
  2. Semaforun Açıklaması
  3. Ayrıntılarla İki Örnek

Başlayalım

Aşağıdaki açıklamayı okurken Let's keep this in mind :

  • Alışverişçi ve Müşteri örneğini alın
  • Alışveriş yapan kişi dizüstü bilgisayar ödünç alıyor
  • Müşteri gelip Dizüstü Bilgisayarı kullanabilir - müşterinin Dizüstü Bilgisayar kullanmak için bir anahtara ihtiyacı vardır
  • Kullanımdan sonra - müşteri Dizüstü Bilgisayarı Shopper'a iade edebilir

Mutex nedir (Sadece 1 iş parçacığı):

Shopper'da bir Dizüstü Bilgisayarın anahtarı var. Bir müşteri, o anda anahtarı alabilir - bir Dizüstü Bilgisayar ödünç alabilir. Görev bittiğinde, Alışverişçi anahtarı sıradaki bir sonraki müşteriye verir (serbest bırakır).

Official Definition :

“Mutex, tipik olarak, cannot be executed concurrently re-entrant code bir bölümüne erişimi seri hale getirmek için kullanılır. Bir mutex nesnesi, yalnızca bir iş parçacığının kontrollü bir bölüme girmesine izin verir ve o bölüme erişmeye çalışan diğer iş parçacıklarını ilk iş parçacığı o bölümden çıkana kadar beklemeye zorlar.

Başka bir deyişle: Mutex = Mutually Exclusive Semaphore

Semafor Nedir (N belirtilen iş parçacığı):

Diyelim ki Shopper'ın 3 özdeş Dizüstü Bilgisayarı ve 3 özdeş anahtarı var. Semafor, free identical Laptop keys sayısıdır. Semafor sayısı - anahtar sayısı - başlangıçta 3'e ayarlanır (üç Dizüstü Bilgisayarın tümü ücretsizdir), ardından Müşteri geldikçe sayım değeri düşürülür. Tüm Dizüstü Bilgisayarlar kullanımdaysa, yani boş anahtar kalmamışsa Dizüstü bilgisayar, semafor sayısı 0'dır. Artık herhangi bir müşteri Laptop'u iade ettiğinde, semafor 1'e (bir boş anahtar) yükseltilir ve sıradaki bir sonraki müşteriye verilir.

Official Definition : “Bir semafor, paylaşılan bir kaynağın eşzamanlı kullanıcı sayısını maksimum sayıya kadar kısıtlar. İş parçacıkları kaynağa erişim talep edebilir (semaforu azaltarak) ve kaynağı kullanmayı bitirdiklerini (semaforu artırarak) bildirebilir.

Başka bir okumanız gerekir: Singleton ThreadSafe Örneğinin Tembel Oluşturulması

Örnek-1: (Aşağıdaki açıklama)

Yukarıdaki öğreticide CrunchifySemaphoreMutexTutorial.java , CrunchifyProducer crunchifyList threadName threadName eklediğinde semafor sinyali verebilir.

CrunchifyConsumer daha sonra semaforu almaya çalışıyor olabilir, böylece CrunchifyProducer bir threadID'nin eklendiğini bildirene kadar bekleyecekler. Eklenen bir veriyi işaretledikten sonra, tüketicilerden biri uyandırılacak ve bir crunchifyList Nesnesini okuyabildiğini bilecektir. Bir listeyi okuyabilir, ardından semaforu elde etmeye çalışmaya geri dönebilir.

Bu süre içinde üretici başka bir paket yazdıysa, tekrar sinyal verdiyse ve tüketicilerden biri daha sonra başka bir paket okumaya devam edecekse ve bu böyle devam eder…

Başka bir deyişle:

Sonuç:

Yarış durumu nasıl önlenir:

What if you have multiple Consumers? Yukarıdaki Java Eğitiminde Tüketiciler (üretici değil), yarış koşullarını önlemek için paketi okurken (ancak semaforu alırken değil) arabelleği kilitlemelidir. Aşağıdaki örnekte, her şey aynı JVM'de olduğu için üretici de listeyi kilitler.

Örnek-2:

Sonuç: