Java中的内存模型规定了多线程程序中各个线程之间如何访问共享内存。Java的内存模型采用了基于线程的内存模型,每个线程都有自己的工作内存,线程之间通过主内存进行通信。Java的内存模型包含了主内存和工作内存两个概念,同时还规定了如何进行内存操作的原子性、可见性和有序性。
在Java中,关键字volatile可以保证变量的可见性,synchronized关键字可以保证变量的原子性和有序性,而Atomic类则提供了一组原子性操作。下面是一个简单的示例代码,用来演示Java中的内存模型:
java
Copy code
public class MemoryModelDemo {
private volatile int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
在上面的代码中,我们定义了一个包含一个volatile变量和一个synchronized方法的类MemoryModelDemo。变量count是volatile的,这意味着任何对变量的修改都将立即刷新到主内存中,从而保证了可见性。方法increment是synchronized的,这意味着任何时刻只有一个线程可以访问该方法,从而保证了原子性和有序性。方法getCount则是普通的非同步方法,用来获取count变量的值。
下面是一个使用MemoryModelDemo类的示例代码:
public class Main {
public static void main(String[] args) throws InterruptedException {
MemoryModelDemo demo = new MemoryModelDemo();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
demo.increment();
}
}).start();
}
Thread.sleep(1000);
System.out.println(demo.getCount());
}
}
在上面的代码中,我们创建了10个线程,每个线程执行1000次increment方法,最终输出demo对象的count变量的值。由于increment方法是synchronized的,因此我们可以保证多个线程对count变量的修改是原子性和有序性的。
而由于count变量是volatile的,因此我们可以保证主内存中的count变量和各个线程的工作内存中的count变量是同步的,从而保证了可见性。最终,程序输出的结果将是10000