变量分类
public enum VariableMultiThreadEnum {
/**
*
*/
static_var(0,"静态变量(类变量)","static variable"),
member_var(1,"成员变量(实例变量)","member variable"),
local_var(2,"局部变量","local variable");
VariableMultiThreadEnum(int index,String name,String ename){
}
}
各变量在多线程下实例
总图
类变量
class StaticRunnable implements Runnable {
// 静态变量
private static int local=0;
final int FOR_COUNT = 50;
@Override
public void run() {
// 静态变量
for (int i = 0; i <= FOR_COUNT; i++) {
System.out.println(Thread.currentThread().getName() + ">>>>>"+"期望值" + i + ">>>>>"+"实际值" + local);
local++;
}
}
}
成员变量
class MemberRunnable implements Runnable {
// 成员变量
private int local=0;
final int FOR_COUNT = 50;
@Override
public void run() {
// 静态变量
for (int i = 0; i <= FOR_COUNT; i++) {
System.out.println(Thread.currentThread().getName() + ">>>>>"+"期望值" + i + ">>>>>"+"实际值" + local);
local++;
}
}
}
局部变量
class LocalRunnable implements Runnable {
final int FOR_COUNT = 50;
@Override
public void run() {
//局部变量
int local=0;
for (int i = 0; i <= FOR_COUNT; i++) {
System.out.println(Thread.currentThread().getName() + ">>>>>"+"期望值" + i + ">>>>>"+"实际值" + local);
local++;
}
}
}
测试
public class VariableMultiThreadTest {
public static void main(String[] args) {
Runnable staticRunnable = VariableMultiThreadEnum.static_var.runnable();
Runnable memberRunnable = VariableMultiThreadEnum.member_var.runnable();
Runnable localRunnable = VariableMultiThreadEnum.local_var.runnable();
test(staticRunnable);
// test(memberRunnable);
// test(localRunnable);
}
public static void test(Runnable runnable) {
Thread threada = new Thread(runnable);
Thread threadb = new Thread(runnable);
threada.start();
threadb.start();
}
}
结果
类变量线程不安全
成员变量线程不安全
局部变量线程安全
解决线程安全问题:线程安全策略
ThreadLocal和局部变量安全