2.1.2實(shí)例變量非線程安全
如果多個(gè)線程共同訪問(wèn)1個(gè)對(duì)象中的實(shí)例變量,則有可能出現(xiàn)“非線程安全”問(wèn)題。
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class HasSelfPrivateNum {
private int num=0;
public void addI(String username){
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over!");
Thread.sleep(200);
}else{
num=200;
System.out.println("b set over!");
}
System.out.println(username+" num="+num);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class ThreadA extends Thread{
private HasSelfPrivateNum numRef;
public ThreadA(HasSelfPrivateNum numRef){
super();
this.numRef=numRef;
}
@Override
public void run() {
super.run();
numRef.addI("a");
}
}
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class ThreadB extends Thread{
private HasSelfPrivateNum numRef;
public ThreadB(HasSelfPrivateNum numRef){
super();
this.numRef=numRef;
}
@Override
public void run() {
super.run();
numRef.addI("b");
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
HasSelfPrivateNum numRef=new HasSelfPrivateNum();
ThreadA threadA=new ThreadA(numRef);
threadA.start();
ThreadB threadB=new ThreadB(numRef);
threadB.start();
}
}
程序運(yùn)行結(jié)果為:
a set over!
b set over!
b num=200
a num=200
本實(shí)驗(yàn)是兩個(gè)線程同時(shí)訪問(wèn)一個(gè)沒有同步的方法,如果兩個(gè)線程同時(shí)操作業(yè)務(wù)對(duì)象中的實(shí)例變量,則有可能會(huì)出現(xiàn)“非線程安全”問(wèn)題。修改HasSelfPrivateNum.java文件如下
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class HasSelfPrivateNum {
private int num=0;
synchronized public void addI(String username){
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over!");
Thread.sleep(200);
}else{
num=200;
System.out.println("b set over!");
}
System.out.println(username+" num="+num);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
重新運(yùn)行程序,運(yùn)行結(jié)果為:
a set over!
a num=100
b set over!
b num=200
摘選自 java多線程核心編程技術(shù)-2.1.2