识别线程安全-共享变量与单实例
public class JavaBean {private String myname;public void aservice(String paraName,int otherPara){//在spring的默认配置下在这里设值,另一个方法使用是错误的this.myname=paraName;bservice();}private void bservice() {String goodName= this.myname;//other work}public String getMyname() {return myname;}public void setMyname(String myname) {this.myname = myname;}}
如果有两个线程A和B,同时进入aservice,A线程设置myname="AName",然后在执行到bservice线程阻塞,此时B线程进入,将myname="BName",然后进入bservice得出正确结果而退出。B线程执行后,myname="BName",A线程恢复,在bservice的方法执行时,使用的myname="BName",计算肯定会出错。但如果你每次使用JavaBean的时候,都是new一个,就不会存在线程安全的问题了。
?
?
虽然线程安全是一个不是很容易理解的话题,但上面两个例子却反映了两个最普遍的线程安全问题。遇到线程问题,最快的解决方法就是去掉变量共享。单线程的程序,永远不会出现线程安全问题。
?
?
?
?
?