Rumah  >  Artikel  >  Java  >  Fahami peranan tidak menentu dalam Java: memastikan keterlihatan dan keteraturan data antara berbilang rangkaian

Fahami peranan tidak menentu dalam Java: memastikan keterlihatan dan keteraturan data antara berbilang rangkaian

王林
王林asal
2024-01-30 08:53:441011semak imbas

Fahami peranan tidak menentu dalam Java: memastikan keterlihatan dan keteraturan data antara berbilang rangkaian

Fahami peranan tidak menentu dalam Java: untuk memastikan keterlihatan dan keteraturan data antara berbilang benang, contoh kod khusus diperlukan

Dalam pengaturcaraan berbilang benang Java, untuk memastikan penyegerakan data antara berbilang benang, kami selalunya Kata kunci yang tidak menentu perlu digunakan. Kata kunci yang tidak menentu boleh memastikan keterlihatan dan susunan, memastikan operasi baca dan tulis berbilang benang pada pembolehubah tertentu adalah betul.

1. Keterlihatan

Dalam persekitaran berbilang benang, jika satu utas mengubah suai pembolehubah yang dikongsi, adalah tidak pasti sama ada utas lain dapat melihat hasil pengubahsuaian ini dengan serta-merta.

Dengan menggunakan kata kunci yang tidak menentu, anda boleh memastikan bahawa penulisan kepada pembolehubah yang tidak menentu kelihatan kepada urutan lain. Iaitu, apabila satu utas mengubah suai nilai pembolehubah yang tidak menentu, utas lain boleh melihat nilai yang diubah suai dengan serta-merta.

Berikut ialah contoh:

VatileDemo kelas awam {

private volatile boolean flag = false;

public void writeFlag() {
    flag = true;
}

public void readFlag() {
    while (!flag) {
        // 无限循环,等待flag变为true
    }
    System.out.println("flag is true");
}

public static void main(String[] args) {
    VolatileDemo demo = new VolatileDemo();

    Thread writeThread = new Thread(() -> {
        demo.writeFlag();
    });

    Thread readThread = new Thread(() -> {
        demo.readFlag();
    });

    writeThread.start();
    readThread.start();
}

}

Dalam contoh di atas, kami mencipta kelas VolatileDemo dan menentukan bendera pembolehubah jenis boolean yang tidak menentu. Kaedah writeFlag digunakan untuk menetapkan bendera kepada benar, dan kaedah readFlag digunakan untuk mengeluarkan sekeping maklumat selepas menunggu bendera menjadi benar.

Dalam kaedah utama, kami mencipta dua utas, satu utas melaksanakan kaedah writeFlag, dan utas lain melaksanakan kaedah readFlag. Memandangkan bendera ialah pembolehubah yang tidak menentu, apabila kaedah writeFlag menetapkan bendera kepada benar, kaedah readFlag akan segera melihat pengubahsuaian ini.

2. Keteraturan

Dalam persekitaran berbilang benang, walaupun pembolehubah dikongsi kelihatan, susunan berbilang rangkaian beroperasi pada pembolehubah ini tidak dapat ditentukan Ini adalah masalah keteraturan.

Dengan menggunakan kata kunci yang tidak menentu, anda boleh memastikan bahawa operasi baca dan tulis pembolehubah tidak menentu dilaksanakan mengikut susunan kod. Maksudnya, apabila satu utas mengubah suai nilai pembolehubah yang tidak menentu, utas lain akan segera melihat pengubahsuaian, dan pengubahsuaian akan dilaksanakan mengikut susunan kod.

Berikut ialah contoh:

VatileDemo kelas awam {

private volatile int count = 0;

public void increaseCount() {
    count++;
}

public void printCount() {
    System.out.println(count);
}

public static void main(String[] args) {
    VolatileDemo demo = new VolatileDemo();

    Thread increaseThread = new Thread(() -> {
        for (int i = 0; i < 1000; i++) {
            demo.increaseCount();
        }
    });

    Thread printThread = new Thread(() -> {
        for (int i = 0; i < 10; i++) {
            demo.printCount();
        }
    });

    increaseThread.start();
    printThread.start();
}

}

Dalam contoh di atas, kami mencipta kelas VolatileDemo dan menentukan kiraan pembolehubah jenis int yang tidak menentu. Kaedah increaseCount digunakan untuk meningkatkan kiraan sebanyak 1, dan kaedah printCount digunakan untuk mengeluarkan nilai kiraan.

Dalam kaedah utama, kami mencipta dua utas, satu utas melaksanakan kaedah increaseCount, dan utas lain melaksanakan kaedah printCount. Memandangkan kiraan ialah pembolehubah yang tidak menentu, apabila kaedah increaseCount mengubah suai nilai kiraan, kaedah printCount akan segera melihat pengubahsuaian dan pengubahsuaian akan dilaksanakan mengikut susunan kod.

Ringkasan:

Dengan menggunakan kata kunci yang tidak menentu, kami boleh memastikan keterlihatan dan susunan pembolehubah dikongsi antara berbilang urutan. Dalam sesetengah kes, kami mungkin perlu menggunakan mekanisme penyegerakan yang disediakan oleh kelas Benang lain, seperti kata kunci disegerakkan atau antara muka Kunci, untuk melaksanakan operasi berbilang benang yang lebih kompleks. Walau bagaimanapun, dalam senario mudah berbilang benang, masalah keterlihatan dan pesanan boleh diselesaikan dengan baik menggunakan kata kunci yang tidak menentu.

Atas ialah kandungan terperinci Fahami peranan tidak menentu dalam Java: memastikan keterlihatan dan keteraturan data antara berbilang rangkaian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn