Java--内存模型

多线程的三大特性:
1.原子性。保证线程安全问题,保证数据的原子性和完整性。
2.可见性。当多个多线程访问同一个变量的时候,一个线程的值改变话其他的线程可以立即看到修改后的值。
3.有序性。程序的执行顺序按照代码的执行顺序。
Java内存模型:简称JMM
Java内存模型表明一个线程对共享变量进行写入时,能对另外一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象的关系:线程之间的共享变量存储在主内存中,每一个线程都一个私有的本地内存,本地内存中存储了该线程按照读或者写共享变量的副本。本地内存是JMM的一个抽象概念,并不是真实存在的,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器的优化。
Volatile:
Volatile 关键字表示变量在多个线程之间是可见。
下面的代码中使用volatile关键字可以保证线程的可见性。

package com.itmayiedu.day02;

import javax.swing.*;

/**
 * Volatile 关键字 保证线程之间是可见的 但不保证原子性。
 */
public class ThreadTrainDemo06 extends Thread {
    private volatile boolean flag = true;//使用volatile可以保证线程的可见性,当主线程修改主内存的数据是 子线程的数据也会立即修改。
    @Override
    public void run() {
        System.out.println("===================>>>>>>> 子线程开始执行。。。。。");
        while (flag){
          //  System.out.println("我还在执行的。。。。。。");
        }
        System.out.println("=====================>>>>>>子线程执行完毕");
    }

    public void setFlag(Boolean flag){
        this.flag =flag;
    }

    public boolean isFlag() {
        return flag;
    }

    public static void main(String[] args) throws Exception {
        ThreadTrainDemo06 threadTrainDemo06 = new ThreadTrainDemo06();
        threadTrainDemo06.start();
        Thread.sleep(1000);//线程停止三秒。
        threadTrainDemo06.setFlag(false);  //主线程修改全局变量是false,如果没有使用volatile 主内存的不会同步到子线程的本地内存中。
        System.out.println("Flag已经修改成false");
        Thread.sleep(1000);
        System.out.println(threadTrainDemo06.isFlag()+"");
    }
}

注意:volatile可以保证线程的但是不保证原子性。
在jdk1.5中加入了atomic包可以解决线程的安全性问题和原子性。

package com.itmayiedu.day02;

    import java.util.concurrent.atomic.AtomicInteger;

public class ThreadTrainDemo07 extends Thread {
   //是个线程同时共享count;static关键字修饰的会被所有的线程共享。
  //  private volatile  static int count  = 0 ;
  private static   AtomicInteger count = new AtomicInteger(0);//保证数据原子性问题。
    @Override
    public void run() {
        for (int i = 0; i <1000 ; i++) {
        //    count++;
            count.incrementAndGet();  //在这里标示自增
        }
        System.out.println(Thread.currentThread().getName()+": "+count.get());//获取count的值。
    }


    public static void main(String[] args) {
        ThreadTrainDemo07 [] threadTrainDemo07s =new ThreadTrainDemo07[10];
        for (int i = 0; i <10 ; i++) {
             threadTrainDemo07s[i] = new ThreadTrainDemo07();
        }
        /*for (ThreadTrainDemo07 threadTrainDemo07:threadTrainDemo07s) {
                threadTrainDemo07.start();
        }*/

        for (int i = 0; i <10 ; i++) {
            threadTrainDemo07s[i].start();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java内存模型Java Memory Model,JMM)是一种规范,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型定义了一套读写内存数据的规范,抽象了主内存和本地内存的概念,以及对于寄存器、一级缓存、二级缓存等的抽象。Java内存模型Java并发编程有关,可以帮助我们实现线程安全的效果。 Java内存结构是指Java虚拟机的运行时数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆、方法区等。Java对象模型是指Java对象在虚拟机中的表现形式,包括对象头、实例数据和对齐填充三部分。 在Java内存模型中,每个线程都有自己的本地内存,本地内存中存储了该线程使用到的主内存中的变量副本。线程对变量的所有操作都必须在主内存中进行,而不能直接对本地内存中的变量进行操作。当一个线程需要使用另一个线程的变量时,必须将该变量从主内存中读取到本地内存中,当该线程对变量进行修改后,必须将该变量的值刷新到主内存中,以便其他线程可以看到该变量的最新值。 Java内存模型中的同步机制包括synchronized关键字、volatile关键字、final关键字和锁等。synchronized关键字和锁可以保证同一时刻只有一个线程可以执行临界区代码,从而实现线程安全。volatile关键字可以保证变量的可见性和有序性,final关键字可以保证变量的不可变性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值