jvm的内存模型其实是借鉴了计算机的CPU内存架构java的内存模型jvm的原子操作intflag变量当被volibate修饰后,只要这个变量在工作内存中一变化,马上就会写到主存中去,如果不被volitale修饰的话,那么工作内存中的变量不确定在什么时候写入到主内存中去,这个操作是jvm控制的一旦有volitable修饰的变量,那么个工作线程修改后,其他线程能感知到变量修改,然后把其他工作线程的这个变量置为无效,让他重新再从主内存中读取并发编程3大特性:有序性,可见性,原子性指令重排:在Java中,为了提高程序运行效率,编译器和处理器可能会对指令进行重排序。这种现象被称为“指令重排”。但是指令重排的一个原则是:在不影响单线程程序执行的结果前提下,才会进行指令重排为什么不用volitable修饰的双重锁不安全?因为一个对象的创建分为好几步:1.创建对象,为该对象分配堆内存空间, 2.初始化对象的init方法,初始化变量3.给instance变量赋值在特殊的情况下,有可能 顺序是 1.3.2 这样的话,再有一个线程进来的时候,虽然没进代码块中,但是发现这个变量已经有值了,直接返回这个没有初始化的对象了,这就是所说的对象半初始化问题,如果使用这个对象的话,会发现好多属性都是Null
jvm的内存模型其实是借鉴了计算机的CPU内存架构java的内存模型jvm的原子操作intflag变量当被volibate修饰后,只要这个变量在工作内存中一变化,马上就会写到主存中去,如果不被volitale修饰的话,那么工作内存中的变量不确定在什么时候写入到主内存中去,这个操作是jvm控制的一旦有volitable修饰的变量,那么个工作线程修改后,其他线程能感知到变量修改,然后把其他工作线程的这个变量置为无效,让他重新再从主内存中读取并发编程3大特性:有序性,可见性,原子性指令重排:在Java中,为了提高程序运行效率,编译器和处理器可能会对指令进行重排序。这种现象被称为“指令重排”。但是指令重排的一个原则是:在不影响单线程程序执行的结果前提下,才会进行指令重排为什么不用volitable修饰的双重锁不安全?因为一个对象的创建分为好几步:1.创建对象,为该对象分配堆内存空间, 2.初始化对象的init方法,初始化变量3.给instance变量赋值在特殊的情况下,有可能 顺序是 1.3.2 这样的话,再有一个线程进来的时候,虽然没进代码块中,但是发现这个变量已经有值了,直接返回这个没有初始化的对象了,这就是所说的对象半初始化问题,如果使用这个对象的话,会发现好多属性都是Null