SORU
6 AĞUSTOS 2012, PAZARTESİ


Neden bir senkronize(bu) kullanabilirsiniz eğer bir ReentrantLock kullanmak?

Eğer bir synchronized (this) kullanım eğer eşzamanlılık kilit bu kadar önemli kılan ne, onu anlamaya çalışıyorum. Örnek kod aşağıda, ya da yapabilirim:

  1. tüm yöntem senkronize veya savunmasız alanı eşitleme (senkronize(bu){...})
  2. YA da bir ReentrantLock ile savunmasız kod alan kilit .

Kod:

private final ReentrantLock lock =  new ReentrantLock(); 
    private static List<Integer> ints;

    public Integer getResult(String name) { 
        .
        .
        .
        lock.lock();
        try{
            if (ints.size()==3) {
                ints=null;
                return -9;
            }   

            for (int x=0; x<ints.size(); x  ) {
                System.out.println("[" name "] " x "/" ints.size() ". values >>>>" ints.get(x));
            }

        }finally {
            lock.unlock();
        } 
        return random;
}

CEVAP
6 AĞUSTOS 2012, PAZARTESİ


ReentrantLockyapılandırılmamış, synchronized -- yani kilitleme için blok bir yapı kullanmak gerekmez yapıları ve hatta yöntemleri arasında bir kilit tutabilir aksine. Bir örnek:

private ReentrantLock lock;

public void foo() {
  ...
  lock.lock();
  ...
}

public void bar() {
  ...
  lock.unlock();
  ...
}

Bu akış imkansız synchronized bir yapı içinde tek bir monitör üzerinden temsil etmektir.


Kenara eden, ReentrantLock lock polling interruptible lock waits that support time-out destekler. ReentrantLock de daha esnek iplik zamanlama sağlayan configurable fairness policy, desteği vardır.

Bu sınıf için yapıcı bir isteğe bağlı kabul ederadaletparametre. Çekişme altında true, set, kilitlerin en uzun süre bekleyen iş parçacığı erişim hakkı verme iyilik. Aksi takdirde bu kilidi herhangi bir özel erişim sırasını garanti etmez. Program kullanarak adil kilitleri erişilmesi çok iş parçacığı olabilir görüntü daha düşük toplam verim (yani, yavaş; genellikle çok daha yavaş) daha kullanarak bu varsayılan ayarı, ama küçük farkları zamanlarında elde kilitler ve garanti eksikliği açlık. Kilitleri adalet parçacığı planlama eşitlik garanti etmediğini unutmayın. Böylece birçok konuları adil bir kilit kullanarak bir diğer etkin iş parçacıkları ve henüz kilidi holding seviyesinde olmasa arka arkaya birden çok kez alabilirsiniz. Ayrıca ** 10 süresiz yöntemi adalet ayarını dikkate almaz unutmayın. Eğer kilidi eğer başka bir iş parçacığı bekleyen varsa bile varsa başarılı olur.


ReentrantLockolabilirayrıca more scalable, çok daha yüksek çekişme altında gerçekleştirme. here bu konuda daha fazla bilgi edinebilirsiniz.

Bu iddia, ancak itiraz edilmiştir; aşağıdaki yorum bakın:

Evresel kilit test, yeni bir kilit her zaman oluşturulur, böylece özel kilitleme yok ve elde edilen veriler geçersiz. Ayrıca, IBM bağlantıyı imkansız yani temel kriter testi bile doğru yürütülmüştür olsun karakterize etmek için kaynak kodu bulunmaktadır.


ReentrantLocks kullanmalıyım? Bu developerWorks göre madde...

Cevabı gayet basit. kullanın o zaman birşeylere ihtiyacın sağlar synchronized gelmez, gibi zaman aşımına kilit bekler, ınterruptible kilit bekler, olmayan blok yapılı kilitler, birden fazla koşul değişkenleri veya kilit yoklama. ReentrantLock ölçülebilirlik faydaları da vardır, ve kullanmalısın, Eğer gerçekten bir durum sergiler yüksek çekişme, ama unutmayın ki büyük çoğunluğu synchronized blok neredeyse hiç sergi herhangi bir çekişme, dursun yüksek çekişme. Eşitleme yetersiz, sadece "performansı daha iyi, eğer kullanıyorsanız" 16**. olacak düşünmek yerine, olduğu kanıtlanmıştır kadar eşitleme ile gelişen öneririm Unutmayın, bu ileri düzey kullanıcılar için gelişmiş araçlar vardır. (Ve gerçekten ileri düzey kullanıcılar basit araçlar yetersiz olduğuna ikna olana kadar bulabildikleri en basit araçları tercih ederler.) Her zaman olduğu gibi, ilk yapmak ve daha hızlı yapmak gerek olup olmadığı konusunda endişe sonra.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • Lamarr Wilson

    Lamarr Wilso

    27 Aralık 2008