Java 线程安全和不安全 r囧r小猫 2021-09-19 17:10 378阅读 0赞 # 概念 # 线程安全就是要让程序运行出我们想要的结果 假设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
还没有评论,来说两句吧...