kendi başına yardımcı olmaz. Kilitsiz bir veri yapısında, veri yapınız değiştiğinde tek bir atomik örnek olması gerekir. Tümtemsil değişmezlerininbu atomik andan hemen önce ve hemen sonra yürürlükte olmaları gerekir.O ( 1 )
Bu, veri yapısında bir değişiklik yapıyorsanız, önemli özellik, özel bir veri yapısında tüm modları yapabilmeniz ve daha sonra tek bir atomik talimatta değişikliklerde değiştirebilmenizdir.
Veri yapıları olduğunda Kilit-özgürlük genellikle en kolay değişmez ( tamamen işlevsel ). Sadece veri yapısının geçerli sürümüne genel bir işaretçi tutun. Okuyucuların hiçbir şeyi kilitlemesi gerekmez. Veri yapısındaki değişiklikler, global işaretçiyi değişmez bir veri yapısına diğerine değiştirerek gerçekleştirilir.
Örneğin: tamamen işlevsel bir ağaç dengeli ağacınız varsa:
- Geçerli global işaretçiyi ağacın köküne kaydedin.
- Bir düğüm ekleyen veya silen yeni bir ağaç oluşturun. (Bu, şu anda ağaçta bulunan düğüm sayısındaki zaman ve mekanda logaritmiktir ve değişiklik noktasından köke kadar yeni düğümler oluşturmayı ve sadece veri yapısının önceki sürümünün eski kısımlarında yeni olan her şeyi işaret etmeyi içerir. )
- Atomik olarak global işaretçiyi kök ile karşılaştırın ve değiştirin. (Eski kök işaretçiyi kaydettiğiniz zaman ile şimdi arasında başka bir değişiklik olursa bunun başarısız olabileceğini unutmayın. Bu durumda, 1. adıma dönüp tekrar deneyin. Buna "iyimser eşzamanlılık kontrolü" denir.)
En önemli bölüm, temsil değişmezlerini sürdürme ihtiyacı hakkında yukarıda söylediğim şeydir. Genellikle ağacın ortasında atomik bir değişiklik yapan bir algoritmaya sahip olmak yeterli değildir. Niye ya? Örneğin: ağacın ön siparişi çaprazlama işlemini gerçekleştiren bir okuyucu iş parçacığınız olabilir. Şu anda okudukları düğümün atası olan bir düğümü değiştirirseniz, zorladıklarını düşündükleri önkoşulları geçersiz kılacaksınız. Okuyucunun veri yapısıyla tam olarak değişikliğinizi yapmadan önceki veya tam olarak değişikliğinizi yaptıktan sonra çalışabilmesi gerekir. Arada bir şey yok.
O ( l o g( N) )O ( N)