Paralel Akışlar: Performans ve Tuzaklar
Paralel akışları etkinleştirin, ortak iş parçacığı havuzunu anlayın ve paylaşılan değiştirilebilir durum hatalarından kaçının.
Paralel Akışlar: Performans ve Tuzaklar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Paralel Akışları Etkinleştirme
Herhangi bir akış üzerinde .parallel() çağrısını kullanın veya Collection.parallelStream() kullanın. Akış işlemleri ortak ForkJoinPool üzerinde çalışır (varsayılan: CPU çekirdeği sayısı - 1 iş parçacığı).
long count = list.parallelStream()
.filter(n -> n % 2 == 0)
.count();
System.out.println(count);Paralel Kullanım Ne Zaman İşe Yarar
Paralel akışlar şu durumlarda değerlidir: veri kümesi büyükse (100.000'den fazla öğe), her öğe üzerindeki işlem hesaplama açısından maliyetliyse ve işlem hattı durumsuz olup sıradan bağımsızsa.
// Good candidate: CPU-heavy computation on large dataset
long sum = LongStream.rangeClosed(1, 10_000_000)
.parallel()
.filter(n -> isPrime(n))
.sum();
System.out.println(sum);Paralel Akışlar Ne Zaman KULLANILMAMALI
Şu durumlarda paralel akışlardan kaçının: küçük koleksiyonlar, G/Ç ağırlıklı işlemler (ForkJoinPool iş parçacıklarını engeller), durum bilgili işlemler (sıralama, distinct) veya sıranın önemli olduğu ve yeniden oluşturulmasının maliyetli olduğu durumlar.
// Bad: I/O bound — blocking ForkJoinPool threads starves other tasks
List<String> result = urls.parallelStream()
.map(url -> httpGet(url)) // BLOCKS the common pool
.collect(Collectors.toList());Paylaşılan Değiştirilebilir Durum Hatası
Paralel akışlar işlemleri aynı anda birden çok iş parçacığında yürütür. Paylaşılan, değiştirilebilir bir koleksiyonu değiştirmek veri yarışlarına ve hatalı sonuçlara yol açar.
// RACE CONDITION — never do this:
List<Integer> results = new ArrayList<>(); // not thread-safe
numbers.parallelStream().forEach(n -> results.add(n)); // corrupts list!
// Fix:
List<Integer> safe = numbers.parallelStream().collect(Collectors.toList());Durum Bilgili İşlemler: sorted ve distinct
sorted() ve distinct(), çıktı üretmeden önce tüm öğelerin görülmesini gerektirir. Bu durum paralelliği sınırlar ve çoğu zaman paralel çalışmayı sıralı çalışmadan daha yavaş hâle getirir.
// sorted() forces collect-all, then sort — parallel overhead usually not worth it:
list.parallelStream().sorted().collect(Collectors.toList());Sıraya Duyarlı İşlemler
findFirst() ve forEachOrdered(), paralel akışlarda karşılaşma sırasını korur ve senkronizasyon maliyeti ekler. Sıra önemli değilse findAny() veya forEach() kullanın.
// Faster in parallel (order-insensitive):
Optional<Integer> any = list.parallelStream().filter(n -> n > 10).findAny();
// Slower in parallel (must preserve order):
Optional<Integer> first = list.parallelStream().filter(n -> n > 10).findFirst();İş Parçacığı Havuzu Boyutunu Seçme
Ortak ForkJoinPool, Runtime.getRuntime().availableProcessors() - 1 iş parçacığı kullanır. Paralel akışları özel bir havuzda çalıştırmak için bunları bir ForkJoinPool.invoke() çağrısının içinde submit ederek çalıştırın.
ForkJoinPool custom = new ForkJoinPool(8);
long result = custom.submit(
() -> LongStream.rangeClosed(1, 1_000_000).parallel().sum()
).get();Paralel ve Sıralı Çalışmayı Karşılaştırmalı Ölçme
Gerçekçi veri boyutlarıyla her zaman JMH kullanarak ölçüm yapın. Paralel çalışmanın ek yükü (bölme, iş parçacığı koordinasyonu, birleştirme), yalnızca hesaplama süresi bu ek yükü açık ara aştığında anlamlıdır.
@Benchmark
public long sequential() { return LongStream.rangeClosed(1,1_000_000).sum(); }
@Benchmark
public long parallel() { return LongStream.rangeClosed(1,1_000_000).parallel().sum(); }Paralel İndirgeme İşlemleri
reduce() ve collect(), işlemler birleşmeli olduğunda ve birim değer doğru seçildiğinde paralel çalışacak şekilde tasarlanmıştır.
// Associative reduce — safe in parallel:
int sum = list.parallelStream().reduce(0, Integer::sum);
// Non-associative: subtraction — NOT safe in parallel:
int bad = list.parallelStream().reduce(0, (a, b) -> a - b); // wrong result!Bölünebilirlik Önemlidir
Paralel akışlar veri kaynağını Spliterator kullanarak böler. ArrayList ve diziler O(1) maliyetle bölünür; LinkedList ve HashSet verimli biçimde bölünemez ve bu da paralel verimliliği azaltır.
Özet: Paralel Akış Kontrol Listesi
Paralel kullanmadan önce şunları doğrulayın: (1) büyük veri kümesi, (2) CPU ağırlıklı işlemler, (3) paylaşılan değiştirilebilir durum yok, (4) sıra önemsiz, (5) bölünebilir kaynak (dizi/ArrayList). Emin olmadığınızda ölçüm yapın.
Hızlı Kontrol
Paralel bir akışta forEach ile iş parçacığı güvenli olmayan bir koleksiyona ekleme yaptığınızda ne olur?
Özet
Paralel akışlar ForkJoinPool kullanır. Büyük, CPU ağırlıklı, sıra duyarsız ve durumsuz işlem hatlarında etkilidir. Paylaşılan durumu asla değiştirmeyin. Karar vermeden önce ölçüm yapın — küçük veri kümelerinde paralel çalışma çoğu zaman daha yavaştır.
Yapay zeka eğitmeniyle Java öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 104
- Dersler
- 374
Sıkça Sorulan Sorular
“Paralel Akışlar: Performans ve Tuzaklar” dersi ücretsiz mi?
Evet — “Paralel Akışlar: Performans ve Tuzaklar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Paralel Akışlar: Performans ve Tuzaklar” dersinde ne öğreneceğim?
Paralel akışları etkinleştirin, ortak iş parçacığı havuzunu anlayın ve paylaşılan değiştirilebilir durum hatalarından kaçının. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Paralel Akışlar: Performans ve Tuzaklar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İç İçe Koleksiyonlar için flatMap
- Paralel Akışlar: Performans ve Tuzaklar
- Spliterator: Paralellik için Bölme
- iterate ve generate ile Sonsuz Akışlar