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.
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(); } }
Dalam contoh di atas, penghalang ingatan dimasukkan antara writerThread
和 readerThread
同时访问共享变量 sharedVar
。如果没有内存屏障,readerThread
可能会读取到旧的 sharedVar
值,导致程序输出错误的结果。为了解决这个问题,可以在 writerThread
和 readerThread
.
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(); } }
Dalam contoh di atas, kami mengubah suai dalam writerThread
和 readerThread
之间插入了内存屏障(通过调用 synchronized
方法)。这样,readerThread
就能够立即看到 writerThread
对 sharedVar
dan tidak akan ada hasil yang salah.
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()); } }
Dalam contoh di atas, kami menggunakan pembolehubah atom sharedVar
来确保多个线程对 sharedVar
的修改是原子的。即使有多个线程同时修改 sharedVar
dan hasil akhirnya juga betul.
JMM digunakan secara meluas dalam pengaturcaraan berbilang benang, seperti:
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!