2013-02-15 13 views
5

Java'da Semaphores'e giriyorum ve bu makaleyi okuyordum http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html. Anlamadığım tek şey, acquire() yönteminin senkronize bir bağlamda kullanılmamasının nedenidir. Yukarıdaki webiste örnek aranıyor:Semaphores'te acquire() yönteminin neden senkronize edilmesine gerek yok?

Onlar bir semafor oluşturun:

private Semaphore semaphore = new Semaphore(100); 

ve sadece böyle bir izni almak: bu mümkün olduğunu olmazdı, Şimdi

semaphore.acquire(); 

iki veya daha fazla iş parçacığı aynı anda() elde etmeye çalışır? Eğer öyleyse, sayımda küçük bir sorun olur.

Veya semaforun kendisi senkronizasyonu nasıl yürütüyor?

cevap

3

Veya semaforun kendisi senkronizasyonu mu ele alıyor?

Evet, temel olarak bu.

Bellek tutarlılık etkileri: dizisindeki Eylemler öncesinde böyle edinilen olarak başarılı bir "acquire" yöntemini izleyen-olmadan önce eylemler) (örneğin serbest bırakılması gibi bir "serbest bırakma" yöntemini çağırarak için the javadoc açıklandığı gibi Semaforlar parçacığı için güvenlidir() başka bir iş parçacığında.

java.util.concurrent paketindeki nesnelerin çoğu işlemi, iş parçacığı için güvenlidir. Daha fazla detay package javadoc'un en altında verilmiştir.

3

Semaphores hızlı olmalı ve bu nedenle CAS (compare and swap) gibi Unsafe sınıfından atomik eşzamanlılık ilkelerini kullanın.

Bu ilkel eşitleme ile çok daha düşük bir düzeyde gerçekleşir ve monitörlere gerek yoktur. (Kilitsiz senkronizasyon). Gerçekte, senkronizasyon, beklenen değer, yazılı/okuma değerine eşit olana kadar sürekli olarak bir döngü kullanılarak gerçekleştirilir.

0

senkronizasyon

burada

javadoc bkz CAS operasyonları ile AbstractQueuedSynchronizer güvencesindedir
İlgili konular