Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan penyusunan semula arahan Java dalam persekitaran berbilang benang

Bagaimana untuk menyelesaikan penyusunan semula arahan Java dalam persekitaran berbilang benang

PHPz
PHPzke hadapan
2023-04-19 15:40:061261semak imbas

1. Prakata

Penyusunan semula arahan akan membantu meningkatkan kecekapan pelaksanaan program dalam persekitaran satu utas dan tidak akan memberi kesan negatif kepada program dalam persekitaran berbilang benang, penyusunan semula arahan akan membawa maksud kepada program yang tidak dijangka.

2. Pemulihan masalah

(1) Pembolehubah bersekutu

Berikut ialah contoh yang boleh memulihkan penyusunan semula arahan 100%. Kaedah

public class D {
    static Integer a;
    static Boolean flag;
    
    public static void writer() {
        a = 1;
        flag = true;
    }
    
    public static void reader() {
        if (flag != null && flag) {
            System.out.println(a);
            a = 0;
            flag = false;
        }
    }
}
1. Ramalan keputusan

reader hanya mencetak nilai pembolehubah flag ke konsol apabila pembolehubah a adalah benar. Kaedah

writer mula-mula melaksanakan operasi penetapan pembolehubah a, dan kemudian melaksanakan operasi penetapan pembolehubah flag.

Jika anda mengikut logik analisis di atas, maka hasil yang dicetak oleh konsol mestilah semuanya 1.

2. Penyusunan semula arahan

Jika kod tidak mempunyai penyusunan semula arahan, maka apabila pembolehubah flag adalah benar, pembolehubah a mestilah 1.

Dalam kod di atas, terdapat penyusunan semula arahan dalam kedua-dua kelas kaedah berkenaan pembolehubah a dan pembolehubah flag.

public static void writer() {
    a = 1;
    flag = true;
}

Dengan memerhati keluaran log, kami mendapati terdapat sejumlah besar 0 keluaran.

Apabila penyusunan semula arahan berlaku di dalam kaedah writer, pembolehubah flag ditetapkan dahulu Pada masa ini, jika utas semasa terganggu dan utas lain memanggil kaedah reader, ia adalah. mengesan bahawa pembolehubah flag adalah benar, maka nilai pembolehubah a akan dicetak. Pada masa ini, terdapat hasil dalam konsol yang melebihi nilai yang dijangkakan.

(2) Baharu mencipta objek

Apabila menggunakan kata kunci baharu untuk mencipta objek, terdapat penyusunan semula arahan kerana operasi bukan atomnya penyusunan semula Arahan akan membawa kesan negatif dalam berbilang -persekitaran berulir.

public class Singleton {
    private static UserModel instance;
    
    public static UserModel getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new UserModel(2, "B");
                }
            }
        }
        return instance;
    }
}

@Data
@AllArgsConstructor
class UserModel {
    private Integer userId;
    private String userName;
}
1. Proses analisis dan penciptaan
  • Gunakan kata kunci baharu untuk mencipta objek, yang dibahagikan secara kasar kepada proses berikut:

  • Buat alamat rujukan dalam ruang tindanan

  • Gunakan fail kelas sebagai templat untuk memperuntukkan memori dalam objek ruang timbunan

  • Memulakan pembolehubah ahli

  • Gunakan pembina untuk memulakan

  • Tetapkan nilai rujukan kepada pembolehubah storan kiri

2. Analisis proses penyusunan semula

Untuk contoh di atas, anggapkan bahawa utas pertama memasuki blok kod yang disegerakkan dan mula mencipta objek Disebabkan wujudnya penyusunan semula, penciptaan objek biasa proses terganggu, yang mungkin berlaku selepas alamat rujukan dibuat dalam ruang tindanan , tetapkan nilai rujukan kepada pembolehubah storan kiri, dan kemudian gangguan berlaku disebabkan oleh kehabisan kepingan masa penjadualan CPU.

Apabila urutan berikutnya mengesan bahawa pembolehubah instance tidak kosong, ia akan digunakan secara langsung. Oleh kerana objek tunggal tidak dibuat seketika, menggunakannya secara langsung akan membawa hasil yang tidak dijangka.

3. Mengatasi penyusunan semula arahan

(1) AtomicReference kelas atom

Gunakan kelas atom untuk merangkum satu set pembolehubah yang berkaitan ke dalam objek, mengambil kesempatan daripada ciri-ciri operasi atom, dengan berkesan mengelakkan masalah penyusunan semula arahan.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ValueModel {
    private Integer value;
    private Boolean flag;
}

Kelas atom harus menjadi penyelesaian pilihan untuk menyusun semula arahan dalam persekitaran berbilang benang bukan sahaja mudah difahami, tetapi kunci mutex bukan berat yang digunakan antara benang adalah agak cekap.

public class E {
    private static final AtomicReference<ValueModel> ar = new AtomicReference<>(new ValueModel());
    
    public static void writer() {
        ar.set(new ValueModel(1, true));
    }
    
    public static void reader() {
        ValueModel valueModel = ar.get();
        if (valueModel.getFlag() != null && valueModel.getFlag()) {
            System.out.println(valueModel.getValue());
            ar.set(new ValueModel(0, false));
        }
    }
}

Apabila arahan disusun semula untuk sekumpulan pembolehubah yang berkaitan, menggunakan kelas operasi atom ialah penyelesaian yang lebih baik.

(2) kata kunci yang tidak menentu

public class Singleton {
    private volatile static UserModel instance;
    
    public static UserModel getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new UserModel(2, "B");
                }
            }
        }
        return instance;
    }
}

@Data
@AllArgsConstructor
class UserModel {
    private Integer userId;
    private String userName;
}

4. Pengertian penyusunan semula arahan

1 tidak terhad kepada program Java Malah, pelbagai penyusun mempunyai operasi penyusunan semula arahan, daripada perisian kepada perkakasan CPU. Penyusunan semula arahan ialah pengoptimuman prestasi untuk atur cara berbenang tunggal. Ia harus jelas bahawa penyusunan semula arahan tidak akan mengubah hasil yang dijangkakan bagi pelaksanaan program berurutan dalam persekitaran berbenang tunggal.

2. Penyusunan semula arahan dalam persekitaran berbilang benang

Penyusunan semula arahan yang dibincangkan di atas dalam dua persekitaran berbilang benang biasa, menganalisis kesan negatifnya dan menyediakan langkah balas masing-masing.

    Untuk pembolehubah yang berkaitan, mula-mula masukkannya ke dalam objek, dan kemudian gunakan kelas atom untuk mengendalikan
  • Untuk objek baharu, gunakan kata kunci yang tidak menentu untuk mengubah suai sasaran Objek boleh menjadi
  • 3. Kunci disegerakkan tidak ada kaitan dengan penyusunan semula

Kunci disegerakkan memastikan bahawa benang mengakses blok kod tertentu dengan teratur melalui kunci pengecualian bersama. Kod di dalam blok kod biasanya disusun semula mengikut strategi yang dilaksanakan oleh pengkompil.

Walaupun kunci yang disegerakkan boleh mengelakkan kesan buruk penyusunan semula dalam persekitaran berbilang benang, overhed benang yang disebabkan oleh kunci mutex adalah agak besar dan tidak disyorkan.

Operasi bukan atom dalam blok yang disegerakkan masih boleh menyebabkan penyusunan semula arahan

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan penyusunan semula arahan Java dalam persekitaran berbilang benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam