Henüz belirtilmeyen önemli bir noktası, bir nesnenin durumunu kesilebilir olması olan mümkün kılmasıdır olan kimlik durum değişmez olması kapsüller nesne.
Birçok program, doğal olarak değişken olan gerçek dünyadaki şeyleri modellemek için tasarlanmıştır. Saat 12: 51'de, bazı değişkenlerin AllTrucks
, bir filonun o andaki (12:51) tüm kamyonlarında hangi yükün bulunduğunu gösteren bir veri yapısının kökü olan # 451 nesnesine bir başvuruda bulunduğunu varsayalım. BobsTruck
# 24601 nesnesine bir referans almak için kullanılabilir, o anda Bob'un kamyonunda hangi yükün bulunduğunu gösteren bir nesneyi gösterir (12:51). Saat 12: 52'de, bazı kamyonlar (Bob's dahil) yüklenir ve boşaltılır ve veri yapıları güncellenir, böylece AllTrucks
şimdi kargo 12: 52'den itibaren tüm kamyonlarda olduğunu gösteren bir veri yapısına referans olacaktır.
Ne olmalı BobsTruck
?
Eğer her bir kamyon nesnesinin 'cargo' özelliği değişmez ise, o zaman # 24601 no.lu nesne, Bob'un kamyonunun saat 12: 51'de sahip olduğu durumu temsil eder. Eğer BobsTruck
# 24601 nesne doğrudan başvuru tutan güncelleyen kod sürece, daha sonra AllTrucks
da güncellemek olur BobsTruck
, Bülent'in kamyonun mevcut durumunu temsil sona erecek. Ayrıca BobsTruck
, bir değişebilir nesne biçiminde saklanmadıkça, güncelleme yapan kodun güncellenebilmesinin tek yolu, kodun AllTrucks
bunu yapmak için açıkça programlanmış olmasından kaynaklanabileceğini unutmayın.
Eğer kişi BobsTruck
tüm nesneleri değişmez tutarken Bob'un kamyonunu gözlemlemek için kullanabilmek isterse , herhangi bir zamanda veya belirli bir zamanda sahip BobsTruck
olduğu değere göre AllTrucks
, Bob'un kamyonunun durumunu verecek olan değiştirilemez bir fonksiyon olabilir . o zaman. Biri, biri yukarıda olduğu gibi, diğeri bir filo devletine ve yeni bir kamyon durumuna referans kabul eden ve yeni bir filo durumuna referans veren bir çift değişmez fonksiyona sahip olabilir. eskisi ile eşleşti, ancak Bob'un kamyonu yeni bir duruma sahip olacaktı.
Ne yazık ki, Bob'un kamyonunun durumuna erişmek istediği her seferinde böyle bir işlevi kullanmak zorunda kalmak, sinir bozucu ve hantal hale gelebilir. Alternatif bir yaklaşım, # 24601 nesnesinin her zaman ve sonsuza dek (birileri referans aldığı sürece) Bob'un kamyonunun şu anki durumunu temsil edeceğini söylemek olacaktır . Bob'un kamyonunun mevcut durumuna art arda erişmek isteyecek olan kod, her zaman zaman alan bir işlevi çalıştırmak zorunda kalmayacaktı, bu nesnenin Bob'un kamyonu olduğunu bulmak için bir kez sadece bir arama işlevi yapabilirdi ve sonra basitçe Bob'un kamyonunun şu anki durumunu görmek istediği zaman bu nesneye eriş.
İşlevsel yaklaşımın, tek dişli bir ortamda veya dişlerin çoğunlukla onu değiştirmek yerine yalnızca verileri gözlemleyeceği çok dişli bir ortamda avantajsız olmadığını unutmayın. İçinde bulunan nesne referansını kopyalayan herhangi bir gözlemci ipliğiAllTrucks
ve ardından temsil edilen kamyon durumlarını inceler, böylece referansı aldığı andan itibaren tüm kamyonların durumunu görür. Bir gözlemci iş parçacığı daha yeni verileri görmek istediğinde, başvuruyu yeniden alabilir. Öte yandan, tek bir değişmez nesne ile temsil edilen filonun tüm durumuna sahip olmak, aynı anda farklı kamyonları aynı anda güncelleyen iki ipliğin bulunmasını engelleyecektir, çünkü her bir iplik kendi cihazlarına bırakıldığında, dahil olan yeni bir "filo durumu" nesnesi üretecektir. kamyonunun yeni hali ve birbirlerinin eski halleri. Her bir iş parçacığı yalnızca değişmediyse CompareExchange
güncelleme yapmak AllTrucks
için kullanırsa ve başarısız olmuşsa yanıtlarsa, doğruluk sağlanabilirCompareExchange
durum nesnesini yenilemek ve işlemi yeniden denemekle birlikte, birden fazla iş parçacığı eşzamanlı bir yazma işlemi yapmaya çalışırsa, performans genellikle tek bir iş parçacığında tüm yazı yazılmasından daha kötü olacaktır; ne kadar çok iş parçacığı bu tür eşzamanlı işlemleri denerse, performans o kadar kötü olur.
Tek tek kamyon nesneleri değişken ise ancak değişken kimlikleri varsa , çok iş parçacıklı senaryo daha temiz hale gelir. Herhangi bir kamyonda bir seferde yalnızca bir ipliğin çalışmasına izin verilebilir, ancak farklı kamyonlarda çalışan ipliğin parazitsiz yapılabilmesi mümkündür. Değişmez nesneler kullanırken bile böyle bir davranışı taklit etmenin yolları olsa da (örneğin, biri "AllTrucks" nesnelerini tanımlayabilir, böylelikle XXX'a ait kamyonun SSS'ye ayarlanması durumu basitçe bir nesnenin oluşturulmasını gerektirir. [XXX] 'a ait kamyonun durumu şimdi [SSS]; her şeyin durumu [AllTrucks’ın eski değeri] ". Böyle bir nesneyi oluşturmak, çekişme durumunda bile yeterince hızlı olacaktı.CompareExchange
döngü uzun sürmezdi. Öte yandan, böyle bir veri yapısının kullanılması, belirli bir kişinin kamyonunu bulmak için gereken süreyi büyük ölçüde arttıracaktır. Değişmez kimlikleri olan değişken nesneler kullanmak bu sorunu önler.