初学多线程,关于sleep有个地方不明白。
代码
package controller;
public class ALogin extends Thread {
// 假设一个A用户登录
@Override
public void run() {
LoginServlet.doPost("a", "aa");
}
}
package controller;
public class BLogin extends Thread {
// 一个B用户登录
@Override
public void run() {
LoginServlet.doPost("b", "bb");
}
}
package controller;
/**
* 实现一个解决非线程安全问题
*
* @author Joy
*
*/
// 模拟一个servlet
public class LoginServlet {
static String usernameRef;
static String passwordRef;
public static void doPost(String username, String password) {
try {
usernameRef = username;
if (username.equals("a")) {
// 线程休眠(暂停)5秒
Thread.sleep(5000);
}
passwordRef = password;
System.out.println("username=" + usernameRef + " password="
+ passwordRef);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package TestMain;
import controller.ALogin;
import controller.BLogin;
public class TestMain {
public static void main(String[] args) {
// 产生非线程安全,值被改变
// A线程一开始会进入休眠状态5秒,然后是B线程启动执行。
ALogin a = new ALogin();
a.start();
BLogin b = new BLogin();
b.start();
}
}
运行结果
username=b password=bb
username=b password=aa
网上的解释线程
刚开始a线程暂停五秒,然后b线程执行,打印第一行。
5秒结束后,a线程难道不会启动吗?第二行为什么出现不同值情况?刚看多线程,不太理解,参考书籍《Java多线程编程核心技术》但书中没有解释这个结果,望解答
usernameRef和passwordRef 是多个线程共享变量,多线程访问,需要同步处理。