Rumah > Java > javaTutorial > Model dan Keterlihatan Memori Java: Melihat lebih dekat pada konsistensi data dalam pengaturcaraan berbilang benang

Model dan Keterlihatan Memori Java: Melihat lebih dekat pada konsistensi data dalam pengaturcaraan berbilang benang

王林
Lepaskan: 2024-02-19 21:00:15
ke hadapan
636 orang telah melayarinya

Java 内存模型与可见性:深入剖析多线程编程中的数据一致性

editor php Xigua akan membawa anda meneroka model memori Java dan keterlihatan secara mendalam, dan menganalisis isu ketekalan data dalam pengaturcaraan berbilang benang. Dalam persekitaran berbilang benang, keterlihatan data adalah penting untuk ketepatan program. Dengan menganalisis model memori Java secara mendalam, kita boleh lebih memahami mekanisme interaksi data dalam pengaturcaraan berbilang benang, dengan itu mengelakkan masalah yang tidak dijangka. Dalam artikel ini, kami akan membincangkan isu utama dalam pengaturcaraan berbilang benang untuk membantu pembaca lebih memahami dan menggunakan pengetahuan berkaitan model memori Java.

  1. Keterlihatan:

Keterlihatan bermakna pengubahsuaian kepada pembolehubah yang dikongsi oleh satu utas boleh dilihat serta-merta oleh utas lain. Dalam JMM, keterlihatan dicapai melalui halangan memori. Halangan memori ialah arahan khas yang memaksa JVM untuk mengepam cache sebelum atau selepas melakukan operasi memori.

public class VisibilityDemo {

private int sharedVar = 0;

public void writerThread() {
sharedVar = 42;
}

public void readerThread() {
int localVar = sharedVar; // 可能读取到旧值
System.out.println("Reader thread: " + localVar);
}

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

Thread writer = new Thread(demo::writerThread);
Thread reader = new Thread(demo::readerThread);

writer.start();
reader.start();

writer.join();
reader.join();
}
}
Salin selepas log masuk

Dalam contoh di atas, penghalang ingatan dimasukkan antara writerThreadreaderThread 同时访问共享变量 sharedVar。如果没有内存屏障,readerThread 可能会读取到旧的 sharedVar 值,导致程序输出错误的结果。为了解决这个问题,可以在 writerThreadreaderThread.

public class VisibilityDemoWithMemoryBarrier {

private int sharedVar = 0;

public void writerThread() {
// 插入内存屏障
synchronized (this) {}

sharedVar = 42;
}

public void readerThread() {
// 插入内存屏障
synchronized (this) {}

int localVar = sharedVar;
System.out.println("Reader thread: " + localVar);
}

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

Thread writer = new Thread(demo::writerThread);
Thread reader = new Thread(demo::readerThread);

writer.start();
reader.start();

writer.join();
reader.join();
}
}
Salin selepas log masuk

Dalam contoh di atas, kami mengubah suai dalam writerThreadreaderThread 之间插入了内存屏障(通过调用 synchronized 方法)。这样,readerThread 就能够立即看到 writerThreadsharedVar dan tidak akan ada hasil yang salah.

  1. Atomicity:

Atomicity bermaksud operasi sama ada dilaksanakan sepenuhnya atau tidak dilaksanakan langsung. Dalam JMM, keatoman dicapai melalui pembolehubah atom dan operasi atom (operat atomion).

Pembolehubah atom ialah pembolehubah khas yang hanya boleh diakses oleh satu utas pada masa yang sama. Operasi atom ialah operasi khas yang boleh dilakukan tanpa gangguan.

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicityDemo {

private AtomicInteger sharedVar = new AtomicInteger(0);

public void incrementSharedVar() {
sharedVar.incrementAndGet();
}

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

Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(demo::incrementSharedVar);
}

for (Thread thread : threads) {
thread.start();
}

for (Thread thread : threads) {
thread.join();
}

System.out.println("Final value of sharedVar: " + demo.sharedVar.get());
}
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan pembolehubah atom sharedVar 来确保多个线程对 sharedVar 的修改是原子的。即使有多个线程同时修改 sharedVar dan hasil akhirnya juga betul.

  1. Permohonan JMM:

JMM digunakan secara meluas dalam pengaturcaraan berbilang benang, seperti:

  • Reka bentuk kelas selamat benang: JMM boleh membantu kami mereka bentuk kelas selamat benang untuk memastikan pembolehubah kongsi dalam kelas boleh diakses dengan betul dalam persekitaran berbilang benang.
  • Pelaksanaan struktur data serentak:
  • JMM boleh membantu kami melaksanakan konkurensistruktur data, seperti baris gilir serentak, tindanan serentak, dll. Struktur data ini boleh digunakan dengan selamat dalam persekitaran berbilang benang.
  • Reka bentuk algoritma serentak berprestasi tinggi:
  • JMM boleh membantu kami mereka bentuk algoritma serentak berprestasi tinggi, seperti algoritma tanpa kunci, dll. Algoritma ini boleh memanfaatkan sepenuhnya CPU berbilang teras untuk mencapai prestasi yang lebih tinggi.
  • Ringkasnya, JMM ialah asas pengaturcaraan berbilang benang Java Memahami prinsip dan aplikasi JMM adalah sangat penting untuk menulis program berbilang benang yang betul dan cekap.

Atas ialah kandungan terperinci Model dan Keterlihatan Memori Java: Melihat lebih dekat pada konsistensi data dalam pengaturcaraan berbilang benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:lsjlt.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan