非线程安全主要指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。
/**
* 线程不安全
* @author xml
*
*/
public class NoThreadSafe {
private static String userName;
private static String passWard;
/**
* 模拟Selvet
*/
public static void doPost(String userNameRef,String passWardRef) {
try {
userName = userNameRef;
if(userName.equals("aaa")) {
Thread.sleep(1000);
}
passWard = passWardRef;
System.out.println("userName:" + userName + "----" + "passWard:" + passWard);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadTestA extends Thread{
@Override
public void run() {
NoThreadSafe.doPost("aaa", "aaa");
}
}
public class ThreadTestB extends Thread{
@Override
public void run() {
NoThreadSafe.doPost("bbb", "bbb");
}
}
public class Test {
public static void main(String[] args) {
ThreadTestA aaa = new ThreadTestA();
aaa.start();
ThreadTestB bbb = new ThreadTestB();
bbb.start();
}
}
image.png
image.png
由于userName,passWard都属于类变量,因此当两个线程同时启动后其值会发生改变,由此造成了结果的错乱。
网友评论