zoukankan      html  css  js  c++  java
  • Java 多线程 -- volatile 山寨版的synchronized

    在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。

    在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是一个轻量级的synchronized,但是 volatile 并不能保证数据的原子性。

    下面看一下加了volatile 和没有加 volatile的区别:
    不加volatile:

    public class VolatileTest {
    	private  static int num = 0;
    	public static void main(String[] args) throws InterruptedException {
    		new Thread(()->{
    			while(num == 0) {
    				if(num == 1) {
    					System.out.println("num=" + num);
    					break;
    				}
    			}
    		}).start();
    		
    		Thread.sleep(1000);
    		num = 1;
    	}
    }
    

    运行以上代码:
    在这里插入图片描述
    由于 while 循环 是一个比较底层的代码,所以一秒后,循环并没有结束。

    下面给变量加上volatile 关键字测试:

    public class VolatileTest {
    	private volatile static int num = 0;
    	public static void main(String[] args) throws InterruptedException {
    		new Thread(()->{
    			while(num == 0) {
    				if(num == 1) {
    					System.out.println("num=" + num);
    					break;
    				}
    			}
    		}).start();
    		
    		Thread.sleep(1000);
    		num = 1;
    	}
    }
    
    

    再运行代码:
    在这里插入图片描述

    运行代码1s 后可以看到循环结束。

    重视基础,才能走的更远。
  • 相关阅读:
    分治思想
    二分查找---查找区间
    二分查找---有序数组的 Single Element
    Ogre碰撞检测
    JavaScript常用检测脚本(正则表达式)
    Js+XML 操作
    C++难点的一些总结
    MFC使用简单总结(便于以后查阅)
    vc中调用Com组件的所有方法详解
    OSG+VS2010+win7环境搭建---OsgEarth编译
  • 原文地址:https://www.cnblogs.com/xzlf/p/12681521.html
Copyright © 2011-2022 走看看