多线程之实例变量与线程安全
分类:
文章
•
2024-09-19 16:10:28
一:线程间数据不共享的实例
- 创建一个继承Thread类的java对象
- 测试类
- 效果:
- 结论
我们创建了3个线程,每个线程都有各自的count变量,自己减少自己的count
变量的值。这样的情况就是线程间变量不共享。
- 结构图如下:
表示线程间的数据不共享,各自存在各自的变量。
二:线程间数据共享的实例一
- 简介
在JVM中,i--这个变量的操作是要分为如下3步:
a:获取原有的i值
b:计算i-1
c:对i进行赋值
那么,在这3个步骤中,如果有多个线程同时访问,那么一定会出现线程的安全问题。
- 实例Demo如下:
⑴创建继承Thread类的对象

⑵测试类

⑶效果:

⑷结论:
a:首先我们在MyThread.java这个类的run方法前加上了synchronized关键字,使多个
线程在执行run方法时,以排队的形式进行处理。当一个线程调用run方法前,先判断run
方法有没有被上锁,如果上锁,说明有其它线程正在调用run方法,必须等其它线程对run
方法调用结束后才能执行run方法。这样就实现了排队调用run方法的目的,也就达到了按
顺序对count变量减1的效果了。synchronized可以在任意对象及方法上加锁,而加锁的这段
代码称为“互斥区”或“临界区”。
b:我们在测试类中只new了一个MyThread线程实例,然后基于这个线程实例我们创建
了5个Thread线程来调用MyThread这个线程实例(根据Java实例的特性,new 的一个
MyThread实例,不同的Thread实例调用的是同一个MyThread实例,那么对应的这
5个Thread线程A,B,C,D,E处理的都是MyThread这一个实例中的数据。)
- 结构图
三:线程间数据共享的实例二
- 创LoginServlet类
- 创建继承Thread的ALogin类
- 创建继承Thread的BLogin类
- 测试类
- 效果

原因就是当a线程sleep的时候,b线程将usernameRef这个全局变量值给改
掉了,所以造成了线程变量安全问题。
- 解决办法

效果: