SORU
27 AĞUSTOS 2013, Salı


= ! iş parçacığı güvenli onay?

i gibi bileşik işlemleri dahil olarak, iş parçacığı güvenli olmadığını biliyorumbirden fazlaişlemleri.

Ama kendisi ile referans kontrolü bir iş parçacığı işlemi güvenli mi?

a != a //is this thread-safe

Bu program ve birden çok iş parçacığı kullanmak için denedim ama başarısız değildi. Benim makinede yarış simüle edemedim sanırım.

DÜZENLEME:

public class TestThreadSafety {
    private Object a = new Object();

    public static void main(String[] args) {

        final TestThreadSafety instance = new TestThreadSafety();

        Thread testingReferenceThread = new Thread(new Runnable() {

            @Override
            public void run() {
                long countOfIterations = 0L;
                while(true){
                    boolean flag = instance.a != instance.a;
                    if(flag)
                        System.out.println(countOfIterations   ":"   flag);

                    countOfIterations  ;
                }
            }
        });

        Thread updatingReferenceThread = new Thread(new Runnable() {

            @Override
            public void run() {
                while(true){
                    instance.a = new Object();
                }
            }
        });

        testingReferenceThread.start();
        updatingReferenceThread.start();
    }

}

Bu iş parçacığı için güvenlik testi için kullanıyorum bu programı.

Garip davranış

Benim program bazı tekrarlamalar arasında başlayan çıkış != onay başvurusu aynı referans başarısız olduğu anlamına gelir bayrak değerini anladım. AMA bazı çıkış olur sabit değeri tekrar false ve sonra çok uzun bir süre için, programı çalıştırmadan* *10 tek bir çıktı oluşturmaz.

Çıkış bazı n (sabit değil) çıkış sabit değer gibi görünüyor yineleme ve değişmez sonra anlaşılacağı gibi.

Çıkış:

Yineleme: bazı

1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true

CEVAP
27 AĞUSTOS 2013, Salı


Eşitleme yokluğunda bu kod

Object a;

public boolean test() {
    return a != a;
}

olabilir doğru üretmek. Bu test için bayt kodu()

    ALOAD 0
    GETFIELD test/Test1.a : Ljava/lang/Object;
    ALOAD 0
    GETFIELD test/Test1.a : Ljava/lang/Object;
    IF_ACMPEQ L1
...

a yerel değişkenler için yükler alanında iki kez gördüğümüz gibi, Eğer a başka bir iş parçacığı karşılaştırma yanlış üretebilir arasında tarafından değiştirildi non-atomik bir işlem değil.

Ayrıca hafıza görünürlük sorunu konumuzla ne ilgisi var, a değişiklik başka bir iş parçacığı tarafından yapılan geçerli iş parçacığı için görünür olacak garantisi yoktur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009
  • MrMimoB

    MrMimoB

    11 NİSAN 2011
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006