《Java多线程编程核心技术(第2版)》 —1.11.7 使用stop()释放锁给数据造成不一致的结果
1.11.7 使用stop()释放锁给数据造成不一致的结果
对锁定的对象进行“解锁”,会导致数据得不到同步的处理,进而出现数据不一致的问题。本节将会讲解使用stop()释放锁给数据造成不一致性的结果,如果出现这样的情况,则程序处理的数据完全有可能遭到破坏,最终导致程序执行的流程是错误的,在此一定要注意。下面来看一个示例。
创建项目stopThrowLock,文件MyService.java代码如下:
package testpackage;
public class MyService {
private String username = "a";
private String password = "aa";
synchronized public String getUsername() {
return username;
}
synchronized public String getPassword() {
return password;
}
synchronized public void printString(String username, String password) {
try {
this.username = username;
Thread.sleep(100000000);
this.password = password;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
调用业务方法printString()的线程代码如下:
package testpackage;
public class MyThreadA extends Thread {
private MyService object;
public MyThreadA(MyService object) {
super();
this.object = object;
}
@Override
public void run() {
object.printString("b", "bb");
}
}
输出username和password的线程代码如下:
package testpackage;
public class MyThreadB extends Thread {
private MyService object;
public MyThreadB(MyService object) {
super();
this.object = object;
}
@Override
public void run() {
System.out.println("username=" + object.getUsername());
System.out.println("password=" + object.getPassword());
}
}
文件Run.java代码如下:
package test.run;
import testpackage.MyService;
import testpackage.MyThreadA;
import testpackage.MyThreadB;
public class Run {
public static void main(String[] args) {
try {
MyService object = new MyService();
MyThreadA threadA = new MyThreadA(object);
threadA.start();
Thread.sleep(100);
MyThreadB threadB = new MyThreadB(object);
threadB.start();
Thread.sleep(3000);
threadA.stop();
System.out.println("stop()执行后,在下方开始打印username和password。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
程序运行结果如图1-52所示。
图1-52 强制停止线程造成数据不一致
由于stop()方法已经在JDK中被标明是“作废/过期”的方法,显然它在功能上具有缺陷,所以不建议在程序中使用stop()方法停止线程。
- 点赞
- 收藏
- 关注作者
评论(0)