当前位置:  首页>> 技术小册>> Java面试指南

Java中的内存模型介绍Java中的内存模型介绍

Java中的内存模型规定了多线程程序中各个线程之间如何访问共享内存。Java的内存模型采用了基于线程的内存模型,每个线程都有自己的工作内存,线程之间通过主内存进行通信。Java的内存模型包含了主内存和工作内存两个概念,同时还规定了如何进行内存操作的原子性、可见性和有序性。

在Java中,关键字volatile可以保证变量的可见性,synchronized关键字可以保证变量的原子性和有序性,而Atomic类则提供了一组原子性操作。下面是一个简单的示例代码,用来演示Java中的内存模型:

java
Copy code
public class MemoryModelDemo {
private volatile int count = 0;

  1. public synchronized void increment() {
  2. count++;
  3. }
  4. public int getCount() {
  5. return count;
  6. }

}
在上面的代码中,我们定义了一个包含一个volatile变量和一个synchronized方法的类MemoryModelDemo。变量count是volatile的,这意味着任何对变量的修改都将立即刷新到主内存中,从而保证了可见性。方法increment是synchronized的,这意味着任何时刻只有一个线程可以访问该方法,从而保证了原子性和有序性。方法getCount则是普通的非同步方法,用来获取count变量的值。

下面是一个使用MemoryModelDemo类的示例代码:

  1. public class Main {
  2. public static void main(String[] args) throws InterruptedException {
  3. MemoryModelDemo demo = new MemoryModelDemo();
  4. for (int i = 0; i < 10; i++) {
  5. new Thread(() -> {
  6. for (int j = 0; j < 1000; j++) {
  7. demo.increment();
  8. }
  9. }).start();
  10. }
  11. Thread.sleep(1000);
  12. System.out.println(demo.getCount());
  13. }
  14. }

在上面的代码中,我们创建了10个线程,每个线程执行1000次increment方法,最终输出demo对象的count变量的值。由于increment方法是synchronized的,因此我们可以保证多个线程对count变量的修改是原子性和有序性的。

而由于count变量是volatile的,因此我们可以保证主内存中的count变量和各个线程的工作内存中的count变量是同步的,从而保证了可见性。最终,程序输出的结果将是10000


该分类下的相关小册推荐: