从头认识多线程-2.1 局部变量与实例变量的线程安全

这一章节我们来讨论一下局部变量与实例变量的线程安全。

1.结论

局部变量线程安全的

实例变量不是线程安全的

2.代码清单

package com.ray.deepintothread.ch02.topic_1;

public class ThreadSafeOfLocalVariable {
	public static void main(String[] args) throws InterruptedException {
		ThreadOne threadOne = new ThreadOne();
		Thread thread = new Thread(threadOne);
		Thread thread1 = new Thread(threadOne);
		thread.start();
		thread1.start();
	}
}

class ThreadOne implements Runnable {

	@Override
	public void run() {
		int count = 0;
		for (int i = 0; i < 5; i++) {
			System.out.println(count++);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

输出:

0
0
1
1
2
2
3
3
4
4

从输出可以看出,count在++的时候没有被另一个线程篡改,因此,局部变量是线程安全的

package com.ray.deepintothread.ch02.topic_1;

public class ThreadSafeOfInstanceVariable {
	public static void main(String[] args) throws InterruptedException {
		ThreadFour threadFour = new ThreadFour();
		Thread thread = new Thread(threadFour);
		Thread thread1 = new Thread(threadFour);
		thread.start();
		thread1.start();
	}
}

class ThreadFour implements Runnable {
	private int count = 0;

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println(count++);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

输出:

0
0
1
2
3
4
5
6
7
8

我们来观察输出结果,可以看到从第四个结果开始,其实两个线程之间就开始互相篡改,而且输出结果看上去是无序的,因此输出结果跟上面的完全不一样

但是,当我们在run上面加上同步标识符,他的输出结果将会变成有序的

package com.ray.deepintothread.ch02.topic_1;

public class ThreadSafeOfInstanceVariable {
	public static void main(String[] args) throws InterruptedException {
		ThreadTow threadTow = new ThreadTow();
		Thread thread = new Thread(threadTow);
		Thread thread1 = new Thread(threadTow);
		thread.start();
		thread1.start();
	}
}

class ThreadTow implements Runnable {
	private int count = 0;

	private synchronized void test() {
		for (int i = 0; i < 5; i++) {
			System.out.println(count++);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void run() {
		test();
	}
}

输出:

0
1
2
3
4
5
6
7
8
9

总结:这一章节主要讲述了局部变量与实例变量的线程安全。

这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread

目录:http://blog.csdn.net/raylee2007/article/details/51204573

时间: 2024-11-07 13:55:13

从头认识多线程-2.1 局部变量与实例变量的线程安全的相关文章

Java 局部变量、实例变量、类变量(静态变量)区别

1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外的变量,用static 修饰,也叫 静态变量 4. 伪代码说明 public class Variable{ static int allClicks=0;//类变量 String str="hello world";//实例变量 public void method(){ int i =

JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称.换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据. 所以,了解变量在方法区.栈内存.堆内存

IOS总结 静变量static、全局变量extern、局部变量、实例变量

1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用static. 静态变量的优点:1.节省内存.静态变量只存储一处,但供所有对象使用. 2.它的值是可以更新的. 3.可提高时间效率.只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值. 2.全局变量extern 什么是全局变量:也称之为外部变量,是在方法外部定义的变量.它不属于哪个方法,而是

全局变量、局部变量、实例变量以及静态变量的区别

全局变量(globals): 也称为成员变量,属于某个类中定义的变量.在整个类中有效. 可分为: (1).类变量:又称静态变量,用static 修饰,可直接用类名调用,所有对象的同一个类变量都是共享同一块内存空间的. (2).实例变量:不用static修饰, 它只能通过对象调用 ,所有对象的同一个实例变量是共享不同的内存空间的. 局部变量(Local variables):是指那些在方法体中定义的变量以及方法的参数,它只在定义它的方法内有效.是相对于全局变量而言的. 当全局变量与局部变量同名时:

如果局部变量与实例变量同名,那么如何在局部变量的作用域内引用实例变量?

public class Sample{ private int a=1; //实例变量 public void b() { int a=2; //局部变量 System.out.println("局部变量:a="+a); System.out.println("实例变量:a="+this.a);//局部变量的作用域内引用实例变量:this.变量名 } public static void main(String[] args) { new Sample().b()

从头认识多线程-2.5 当异常出现时,线程自动释放锁

这一章节我们来讨论一下下面的情况:当异常出现时,线程自动释放锁. 1.一般情况 package com.ray.deepintothread.ch02.topic_6; import java.util.Random; public class ReleaseTheLockWhenException { public static void main(String[] args) throws InterruptedException { MyTestObjectOne myTestObject

实例变量和局部变量

java中的实例变量:编辑 含义: 实例变量:定义在类中但在任何方法之外.(New出来的均有初始化)[1] 与局部变量的异同: 局部变量:定义在方法之中的变量. 1. 局部变量要先赋值,再进行运算,而实例变量均已经赋初值.(这是局部变量和实例变量的一大区别) 2. 实例变量的对象赋值为null. 3. 局部变量不允许范围内定义两个同名变量.实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效. 4. 实例变量和局部变量允许命名冲突.

实例变量,局部变量,全局变量,静态全局变量

摘抄网上的 定义: 实例变量:定义在一个类的各个内部方法之外,是内部方法共享的变量 局部变量:定义在方法之中的变量,但是这个方法使用的变量,其他方法和类没法使用. 全局变量:也称为外部变量,它是在函数外部定义的变量,一个程序的所有的java源文件都可用. 静态全局变量:一程序由多个java源文件组成时,可以用静态全局变量指定某一个java源文件,仅这个java文件可用这变量. 1 int a,b; //外部变量 2 static int c;//静态外部变量 3 4 public class S

java中什么是实例变量

在类的声明中,属性是用变量来表示的.这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的.类的每个对象维护它自己的一份实例变量的副本. 实例变量:定义在类中但在任何方法之外.(New出来的均有初始化) 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被一个方法.构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息: 访问修饰符可以修饰实例变量: 实例变量对于类中的方法.构造方法或者语