JMM和volatile

1、volatile

  一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

  1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

  2)禁止进行指令重排序(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

2、JMM

3、代码示例

package com.yanshu;

class MyNmuber{
    volatile int number=10;
    public void addTo50(){ this.number=50; }

}

/**
 * @author :yangyuanyuan
 * @description:TODO
 * @date :2021/1/28 15:36
 * JMM=可见性(通知机制)
 * 两个线程 mian线程和A线程,A线程修改numbe的值
 */
public class test5 {
    public static void main(String[] args) {
        MyNmuber myNmuber = new MyNmuber();

        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t  come in ");
            //暂停一会线程
            try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }
            myNmuber.addTo50();//将10修改为50
            System.out.println(Thread.currentThread().getName()+"\t  update number,number value: "+myNmuber.number);

        }
      ,"A"  ).start();

        while (myNmuber.number==10){
            //需要有一种通知机制告诉main线程,number已经修改成50,跳出while
        }

        System.out.println(Thread.currentThread().getName()+"\t massion is over");
    }

}

number前不加volatile关键字时。main线程一种在while循环中等待

加上volatile关键字时

posted @ 2021-01-28 16:01  勤奋的园  阅读(73)  评论(0编辑  收藏  举报