使用stop()釋放鎖將會給數據造成不一致的結果。如果出現這樣的情況,程序處理的數據就有可能遭到破壞,最終導致程序執行的流程出錯,一定要特別注意。
/**
* @author wuyoushan
* @date 2017/3/27.
*/
public class SynchronizedObject {
private String username="a";
private String password="aa";
public void printString(String username,String password){
try{
this.username=username;
Thread.sleep(100000);
this.password=password;
}catch (InterruptedException e){
e.printStackTrace();
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/**
* MyThread線程測試
* @author wuyoushan
* @date 2017/3/21.
*/
public class MyThread extends Thread {
private SynchronizedObject object;
public MyThread(SynchronizedObject object) {
this.object = object;
}
@Override
public void run() {
object.printString("b","bb");
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
try{
SynchronizedObject object=new SynchronizedObject();
MyThread thread=new MyThread(object);
thread.start();
Thread.sleep(500);
thread.stop();
System.out.println(object.getUsername()+" "+object.getPassword());
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
程序的運行結果如下:
b aa
由于stop()方法已經在JDK中被標明是“作廢/過期”的方法,顯然它在功能上具有缺陷,所以不建議在程序中使用stop()方法
摘選自 java多線程核心編程技術-1.7.7