线程中局部变量和非局部变量的区别

在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


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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值