概念
线程安全就是要让程序运行出我们想要的结果
假设A和B同时去不同ATM上取同一张卡的1000块钱,如果是线程不安全,那么A和B可以同时取到1000块钱(两人赚大发啦),而如果线程安全呢,就只有一个人能取出来1000块钱。
代码演示, 不安全
package com.javabase;
public class User {
public int age=1;
public void add(){
for(int i=0;i<10;i++){
this.age++;
}
}
}
package com.javabase;
public class ThreadTest4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
User u=new User();
Runnable run=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"--当前值:"+u.age);
u.add();
}
};
for(int i=0;i<10;i++){
Thread a=new Thread(run);
a.start();
// System.out.println("join之前:"+Thread.currentThread().getName());
// try {
// a.join();//相当于,插队
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
//
System.out.println("最后结果:"+u.age);
}
}
运行结果:
Thread-0–当前值:1
最后结果:1 //正确的最后结果应该是101
Thread-1–当前值:1
Thread-2–当前值:21
Thread-4–当前值:21
Thread-5–当前值:41
Thread-6–当前值:51
Thread-7–当前值:61
Thread-8–当前值:71
Thread-3–当前值:81
Thread-9–当前值:81
线程安全 演示代码
package com.javabase;
public class ThreadTest4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
User u=new User();
Runnable run=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"--当前值:"+u.age);
u.add();
}
};
for(int i=0;i<10;i++){
Thread a=new Thread(run);
a.start();
System.out.println("join之前:"+Thread.currentThread().getName());
try {
a.join();//相当于,插队
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
System.out.println("最后结果:"+u.age);
}
}
运行结果:
join之前:main
Thread-0–当前值:1
join之前:main
Thread-1–当前值:11
join之前:main
Thread-2–当前值:21
join之前:main
Thread-3–当前值:31
join之前:main
Thread-4–当前值:41
join之前:main
Thread-5–当前值:51
join之前:main
Thread-6–当前值:61
join之前:main
Thread-7–当前值:71
join之前:main
Thread-8–当前值:81
join之前:main
Thread-9–当前值:91
最后结果:101