SORU
6 AĞUSTOS 2014, ÇARŞAMBA


Neden atomik değil miyim?

Neden Java i atomik değil mi?

Biraz daha derine almak için Java iş parçacığı döngü nasıl çalıştırılır saymaya çalıştım.

Bir kullandım

private static int total = 0;

ana sınıfında.

İki konu var.

  • İş Parçacığı 1: System.out.println("Hello from Thread 1!"); Yazdırır
  • İplik 2: System.out.println("Hello from Thread 2!"); Yazdırır

Ve çizgiler iplik 1 ve 2 iş parçacığı tarafından basılmış sayıyorum. Ama iplik 2 iplik 1 satır satır satır çıktısı sayısı uyuşmuyor.

İşte benim kod:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    private static int total = 0;
    private static int countT1 = 0;
    private static int countT2 = 0;
    private boolean run = true;

    public Test() {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        newCachedThreadPool.execute(t1);
        newCachedThreadPool.execute(t2);
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        run = false;
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println((countT1   countT2   " == "   total));
    }

    private Runnable t1 = new Runnable() {
        @Override
        public void run() {
            while (run) {
                total  ;
                countT1  ;
                System.out.println("Hello #"   countT1   " from Thread 2! Total hello: "   total);
            }
        }
    };

    private Runnable t2 = new Runnable() {
        @Override
        public void run() {
            while (run) {
                total  ;
                countT2  ;
                System.out.println("Hello #"   countT2   " from Thread 2! Total hello: "   total);
            }
        }
    };

    public static void main(String[] args) {
        new Test();
    }
}

CEVAP
6 AĞUSTOS 2014, ÇARŞAMBA


i Java atom oranı i kullanır çoğunda mevcut olmayan özel bir gereklilik olduğu için muhtemelen atom değildir. Bu şartı önemli bir yükü vardır: artırma işlemi atom yapımında büyük bir maliyeti var; sıradan bir artış mevcut olması gerekmez, her iki yazılım ve donanım düzeyde eşitleme içerir.

i non-atomik bir artış gerçekleştirilir, ve özellikle bir atom artış performans olarak tasarlanmış belgelenmiş, olması gereken tartışma i = i 1 kullanarak yapabilirsin. Ancak, bu "" arasında Java, C ve C . kültürel uyumluluk kıracak Yanı sıra, programcılar C gibi dillere aşina kabul gören uygun bir gösterim, sınırlı şartlar altında sadece uygulanan özel bir anlam vererek bir kenara alın.

Temel C veya for (i = 0; i < LIMIT; i ) C gibi kod atom i kullanmak için uygunsuz olur çünkü for (i = 0; i < LIMIT; i = i 1); Java dönüşecektir. Daha da kötüsü, Java programcıları için C ya da C gibi diller geliyor i Her neyse, atom talimatları gereksiz kullanımı sonucu kullanmak istiyorsunuz.

Hatta makine komut seti seviyesinde artış tür bir işlem genellikle performansı artırmak için atom değildir. 86, "öneki kilidi" inc talimat atom yapmak için kullanılmalıdır: aynı nedenlerle yukarıda. özel bir talimat inc her atom, o-cekti asla kullanıldığında olmayan bir atom ınc gereklidir; programcılar ve Derleyiciler olur oluşturmak yükleyen kod ekler 1 ve depolar, çünkü bu şekilde daha hızlı olur.

Bazı komut seti mimarileri, yok atom inc ya da belki de hiç inc; bir atom ınc CABASI, sizin için yazmak bir yazılım döngü kullanır ll sc: load bağlantılı, ve mağaza-koşullu. Kelime değişmedi, ya da başka başarısız olursa yük bağlı okur kelime ve mağaza-mağaza koşullu yeni değeri tespit edilir ve yeniden deneyin bir neden olduğu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • BrandonHarrisWalker

    BrandonHarri

    27 Kasım 2006
  • Migs351

    Migs351

    3 HAZİRAN 2007