Senkronize kullanma - 1

"Merhaba, Amigo!"

"Evet, buradayım, buradayım."

"Bugün size Sync'i pratikte kullanmayı anlatacağım ."

"Bir programda birçok nesne ve iş parçacığı olduğunda, genellikle birden çok iş parçacığı aynı nesneyle aynı anda çalışır. Bunu yaparken, iş parçacıkları birbiriyle etkileşime girer."

"Evet, bunu zaten biliyorum."

"Öyleyse, birden fazla iş parçacığı tarafından erişilen bir nesneye sahip olduğunuzu varsayalım. Sorunlardan kaçınmak için iki şey yapabilirsiniz."

"Birincisi, nesneye erişilen her yeri sarmak için senkronize bloklar kullanmaktır. Ancak, bazı programcılar nesneye senkronize bir blok olmadan doğrudan erişen kod yazarsa bu yaklaşım işe yaramayabilir."

"Bu nedenle, çoğu zaman ikinci bir yaklaşım kullanılır - nesneyi güvenli hale getirir." "Başka bir deyişle, senkronize mekanizma nesnenin kendisinde yerleşiktir: metotlarını senkronize ilan eder ve/veya senkronize bloklardaki metotlarının içindeki kodu sarar."

"Yani birden fazla iş parçacığından kullanabileceğim herhangi bir nesne ve bu programdaki neredeyse tüm nesneler, iş parçacığı güvenli hale getirmem gerekiyor?"

"Genel olarak, evet. Gerçekte, bir programdaki tüm nesneler farklı iş parçacıkları tarafından kullanılmaz, ancak genellikle çok sayıda vardır. Bu nedenle, bir iş parçacığı için kod yazmaya başladığınızda ve ondan çeşitli nesnelere eriştiğinizde, ardından her yöntem çağrısında kendinize "Bu arama güvenli mi?" diye sormalısınız.

"Güvenli?"

"İş parçacığı güvenli, yani birden çok iş parçacığından güvenle çağrılabilir."

"İşte bazı örnekler. Farklı iş parçacıklarından erişilen bir String nesneniz olduğunu varsayalım. Zaten hatırlamanız gerektiği gibi, String değişmezdir - diğer tüm ilkel türler gibi. Bu, bir nesnenin oluşturulduktan sonra değişmediği anlamına gelir. . Bu, böyle bir nesneyi "kırmanın" imkansız olduğu anlamına gelir. Tüm değişmez nesneler iş parçacığı açısından güvenlidir."

"Pekala, bu işleri kolaylaştırır."

"Şimdi, değişebilir bir diziye ihtiyacınız olduğunu varsayalım."

"Evet, hatırlıyorum. İki tür dize vardır: StringBuffer ve StringBuilder. StringBuffer, StringBuilder gibidir, ancak tüm yöntemleri senkronize edilmiştir. Aynı zamanda iş parçacığı açısından güvenli midir?"

"Evet. Birden fazla iş parçacığından bir StringBuilder nesnesine erişmeniz gerekiyorsa, onu bir StringBuffer ile değiştirmelisiniz. Aksi takdirde, er ya da geç iş parçacıkları onu aynı anda değiştirir ve onu «kırar».

"Ya farklı iş parçacıklarından erişilen nesne kendi sınıfıma ait bir nesneyse? Bu durumda da yöntemlerine synchronized eklemem gerekir mi?"

"Evet. Bu kuralı takip etmek en iyisidir: farklı dizilerden erişilecek tüm nesneler iş parçacığı açısından güvenli olmalıdır."

"Anlıyorum. Her şeyin bu kadar ciddi olduğunu düşünmemiştim. Teşekkürler Ellie."

"Rica ederim. Umarım Diego size kolay görevlerinden birkaçını verdiğinde bu ipuçları size yardımcı olur. ☺"