我是靠谱客的博主 失眠唇膏,最近开发中收集的这篇文章主要介绍线程中局部变量和非局部变量的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在Java线程中,局部变量会独自开辟一块内存来储存,相对于每个线程来说,它们都是每个线程所私有的,所以不受其他线程影响。

如果一个变量是静态变量,那么多个线程对同一个静态变量进行操作时,它们对该静态变量的修改是彼此影响的(也就是说一个线程对静态变量的改变会影响到其他线程)。

如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量的修改是彼此影响的(也就是说一个线程对成员变量的改变会影响到其他线程)。

如果一个变量是局部变量,那么每个县城都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他线程。


可执行以下测试代码查看效果:

public class ThreadModifyVariableTest {

	public static void main(String[] args) throws InterruptedException {

		ModifyStaitcVariableThread staitcVariableThread = new ModifyStaitcVariableThread();
		for (int i = 0; i < 2; i++) {
			Thread thread = new Thread(staitcVariableThread);
			thread.setName(ModifyStaitcVariableThread.class.getSimpleName() + " " + i);
			thread.start();
		}

		Thread.sleep(500);
		System.out.println();

		ModifyInstanceVariableThread instanceVariableThread = new ModifyInstanceVariableThread();
		for (int i = 0; i < 2; i++) {
			Thread thread = new Thread(instanceVariableThread);
			thread.setName(ModifyInstanceVariableThread.class.getSimpleName() + " " + i);
			thread.start();
		}

		Thread.sleep(500);
		System.out.println();

		ModifyLocalVariableThread localVariableThread = new ModifyLocalVariableThread();
		for (int i = 0; i < 2; i++) {
			Thread thread = new Thread(localVariableThread);
			thread.setName(ModifyLocalVariableThread.class.getSimpleName() + " " + i);
			thread.start();
		}

	}
}

class ModifyStaitcVariableThread implements Runnable {

	private static String staticVariable;

	@Override
	public void run() {
		staticVariable = Thread.currentThread().getName();
		try {
			// 如果在我睡眠时,其他线程也进入这个方法,并执行staticVariable = string;
			// 那么我待会醒来打印的staticVariable就是被其他线程修改过的值
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " --------:-------- " + staticVariable);
	}
}

class ModifyInstanceVariableThread implements Runnable {

	private String instanceVariable;

	@Override
	public void run() {
		instanceVariable = Thread.currentThread().getName();
		try {
			// 如果在我睡眠时,其他线程也进入这个方法,并执行instanceVariable = string;
			// 那么我待会醒来打印的instanceVariable就是被其他线程修改过的值
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " --------:-------- " + instanceVariable);
	}
}

class ModifyLocalVariableThread implements Runnable {
	@Override
	public void run() {
		String localVariable = Thread.currentThread().getName();
		try {
			// 如果在我睡眠时,其他线程也进入这个方法,并执行localVariable =string;
			// 那么其他线程其实也改不了我的localVariable的值, 因为其他线程现在改的不是我的localVariable,
			// 每个线程都有一个自己的localVariable,所以我醒来时打印的localVariable一定是我自己赋上的值
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " --------:-------- " + localVariable);
	}
}


多次执行以上代码会得到不同的结果,如:

结果1.

ModifyStaitcVariableThread 1 --------:-------- ModifyStaitcVariableThread 0
ModifyStaitcVariableThread 0 --------:-------- ModifyStaitcVariableThread 0

ModifyInstanceVariableThread 1 --------:-------- ModifyInstanceVariableThread 0
ModifyInstanceVariableThread 0 --------:-------- ModifyInstanceVariableThread 0

ModifyLocalVariableThread 1 --------:-------- ModifyLocalVariableThread 1
ModifyLocalVariableThread 0 --------:-------- ModifyLocalVariableThread 0
结果2.

ModifyStaitcVariableThread 1 --------:-------- ModifyStaitcVariableThread 1
ModifyStaitcVariableThread 0 --------:-------- ModifyStaitcVariableThread 1

ModifyInstanceVariableThread 1 --------:-------- ModifyInstanceVariableThread 1
ModifyInstanceVariableThread 0 --------:-------- ModifyInstanceVariableThread 1

ModifyLocalVariableThread 0 --------:-------- ModifyLocalVariableThread 0
ModifyLocalVariableThread 1 --------:-------- ModifyLocalVariableThread 1

结果3.

ModifyStaitcVariableThread 0 --------:-------- ModifyStaitcVariableThread 0
ModifyStaitcVariableThread 1 --------:-------- ModifyStaitcVariableThread 0

ModifyInstanceVariableThread 1 --------:-------- ModifyInstanceVariableThread 1
ModifyInstanceVariableThread 0 --------:-------- ModifyInstanceVariableThread 1

ModifyLocalVariableThread 0 --------:-------- ModifyLocalVariableThread 0
ModifyLocalVariableThread 1 --------:-------- ModifyLocalVariableThread 1
结果4.

ModifyStaitcVariableThread 1 --------:-------- ModifyStaitcVariableThread 1
ModifyStaitcVariableThread 0 --------:-------- ModifyStaitcVariableThread 1

ModifyInstanceVariableThread 0 --------:-------- ModifyInstanceVariableThread 0
ModifyInstanceVariableThread 1 --------:-------- ModifyInstanceVariableThread 0

ModifyLocalVariableThread 1 --------:-------- ModifyLocalVariableThread 1
ModifyLocalVariableThread 0 --------:-------- ModifyLocalVariableThread 0


可以发现,只有局部变量最后打印的值和它睡眠之前设置的值是保持一致的,两个线程互不影响。



最后

以上就是失眠唇膏为你收集整理的线程中局部变量和非局部变量的区别的全部内容,希望文章能够帮你解决线程中局部变量和非局部变量的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部