• Java多线程之volatile关键字《一》


    关键字volatile的主要作用是使变量在多个线程间可见。

    1.关键字volatile与死循环

    如果不是在多继承的情况下,使用继承Thread类和实现Runnable接口在取得程序运行的结果上并没有什么太大的区别。如果一旦出现“多继承”的情况,则用实现Runnable接口的方式来处理多线程的问题就是很有必要的。

    下面我们用实现Runnable接口的的方式来理解多线程的使用,也看实验volatile关键字在并发情况下的一些特性。

    1.1创建一个PrintString类:

    package edu.ymm.about_volatile;
    
    public class PrintString {
    	private boolean isContinuePrint = true;
    	public boolean isContinuePrint() {
    		return isContinuePrint;
    	}
    	public void setContinuePrint(boolean isContinuePrint) {
    		this.isContinuePrint = isContinuePrint;
    	}
    	public void printStringMethod() {
    		try {
    			while(isContinuePrint == true) {
    				System.out.println("run printStringMethod threadName" 
    							+ Thread.currentThread().getName());
    				Thread.sleep(1000);
    			}
    		}catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

     1.2创建一个Test测试类:

    package edu.ymm.about_volatile;
    
    public class Test {
    
    	public static void main(String[] args) {
    		PrintString printString = new PrintString();
    		printString.printStringMethod();
    		System.out.println("我要停止它! stopThread=" 
    				+ Thread.currentThread().getName());
    		printString.setContinuePrint(false);
    	}
    
    }
    

     执行结果如下:

    程序开始运行,根本就停不下来,结果如上图所示,停不下来的原因主要就是mian线程一直在处理while()循环,导致程序不能继续执行后面的代码。所以得用多线程来解决。

    2.解决同步死循环

    2.1创建PrintString类如下:

    package edu.ymm.about_volatile;
    
    public class PrintString implements Runnable {
    	private boolean isContinuePrint = true;
    	public boolean isContinuePrint() {
    		return isContinuePrint;
    	}
    	public void setContinuePrint(boolean isContinuePrint) {
    		this.isContinuePrint = isContinuePrint;
    	}
    	public void printStringMethod() {
    		try {
    			while(isContinuePrint == true) {
    				System.out.println("run printStringMethod threadName" 
    							+ Thread.currentThread().getName());
    				Thread.sleep(1000);
    			}
    		}catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	@Override
    	public void run() {
    		printStringMethod();
    	}
    }
    

     2.2创建Run测试类如下:

    package edu.ymm.about_volatile;
    
    public class Run {
    
    	public static void main(String[] args) {
    		PrintString printString = new PrintString();
    		new Thread(printString).start();
    		System.out.println("我要停止它! stopThread="  
    				+ Thread.currentThread().getName());
    		printString.setContinuePrint(false);
    	}
    
    }
    

     执行结果如下:

    但是,上面的代码运行在-server服务器的64bit的JVM上时,会出现死循环,解决办法就是volatile.

    关键字volatile的作用就是强制从公共栈里面取得变量的值,而不是从线程私有数据栈中取得变量的值。

  • 相关阅读:
    HTML5 文件上传
    Vue-Router模式、钩子
    网络基础协议随笔
    Vue-Router基础使用
    vue中mixin的一点理解
    纯css3跑马灯demo
    Charles使用笔记
    提个醒。。。
    本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案
    easyUI datagrid 清空
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/10761851.html
Copyright © 2020-2023  润新知