成员变量的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的
1.[代码]不安全实例
package boom;
class Person {
private int num;
public void count() {
for(int i = 1; i <= 10; i++) {
num += i;
}
System.out.println(Thread.currentThread().getName() + "-" + num);
}
}
public class test {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
Person per = new Person();
public void run() {
per.count();
}
};
for(int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}
}
//期望输出都为55 ,但实际不是
2.[代码]解决方法一
package boom;
class Person {
//private int num;
public void count() {
int num=0;
for(int i = 1; i <= 10; i++) {
num += i;
}
System.out.println(Thread.currentThread().getName() + "-" + num);
}
}
public class test {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
Person per = new Person();
public void run() {
per.count();
}
};
for(int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}
}
3.[代码]解决方法二
package boom;
class Person {
private int num;
public void count() {
//int num=0;
for(int i = 1; i <= 10; i++) {
num += i;
}
System.out.println(Thread.currentThread().getName() + "-" + num);
}
}
public class test {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
//Person per = new Person();
public void run() {
Person per = new Person();
per.count();
}
};
for(int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}
}