我有云服务器如何建站,郑州做定制网站的公司,诸城做网站的,怎么做网站移动端volatile 是JAVA虚拟机提供的轻量级的同步机制#xff0c;有三大特性
1、保证可见性 2、不保证原子性 3、禁止指令重排
JMM JAVA内存模型本身是一种抽象的概念并不真实存在 它描述的是一组规则或规范#xff0c;提供这组规范定义了程序中各个变量#xff08;包括实例变…volatile 是JAVA虚拟机提供的轻量级的同步机制有三大特性
1、保证可见性 2、不保证原子性 3、禁止指令重排
JMM JAVA内存模型本身是一种抽象的概念并不真实存在 它描述的是一组规则或规范提供这组规范定义了程序中各个变量包括实例变量、静态变量的访问方式。 JMM关于同步的规定
线程解锁前必须将工作内存的变量刷新到主内存
线程加锁前必须将主内存的数据加载到线程的工作内存中
加锁解锁必须是同一把锁
主内存是共享内存区域可以简单理解为堆工作内存是线程独享的空间可以简单理解为栈
各个线程不能直接操作主内存的变量只能通过操作主内存的变量副本来实现线程间的通信。
当某个线程在自己的工作内存中修改了某个主内存中的变量副本并将该数据在主内存中进行了刷新就会第一时间通知到其他线程该变量的值已经改变并更新该变量的值这就是可见性volatile是保证可见性的 当 age变量没有被volatile关键字修饰的时候AAA线程中修改的age的值已经在主内存里面更新了但是没有通知到main线程所以main线程里面age的值还是10会一直在while循环里面。
使用volatile修饰age变量后当主内存里面的age变量更新后main线程里面age的值也会第一时间被更新所以不会一直在while循环里面
package com.juc.demo;import java.util.concurrent.TimeUnit;/*** ClassName: VolitalTest* Description:* Author: 01412126* Date: 2023/8/10 19:27*/
class Dog{volatile int age 10;
// int age 10;public void changeAgeTo90(){this.age 90;}
}class VolitalTest {public static void main(String[] args) {Dog dog new Dog();new Thread(() - {System.out.println(Thread.currentThread().getName() come in);try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}dog.changeAgeTo90();System.out.println(Thread.currentThread().getName() update dog age dog.age);},AAA).start();while (dog.age 10) {//System.out.println( main thread come in and find dog age );}System.out.println(Thread.currentThread().getName() finally come in and find dog age dog.age);}
}