下面我们用一段代码进行模拟这个事故发生
描述:这里读线程ReadObjectThread在读到ID和name不一致时候就会进行输出这些对象,而ChangeObjectThread总是会写入两个相同的ID和NAME值,我们代码最后使用的stop方法
package com.base.zhou.thread.pack2;
/**
* @author zhou.moumou
* @version 2018年5月7日 下午9:27:33
* @description
*/
public class Thread_Stop {
public static User user = new User();
public static class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
id = 0;
name = "0";
}
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", id=" + id + '}';
}
}
public static class ChangeObjectThread extends Thread {
public void run() {
while (true) {
synchronized (user) {
int v = (int) (System.currentTimeMillis() / 1000);
user.setId(v);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
user.setName(v + "");
}
//让自己或者其他线程运行,并不是单纯的让给其他线程
Thread.yield();
}
}
}
public static class ReadObjectThread extends Thread {
public void run() {
while (true) {
synchronized (user) {
if (user.getId() != Integer.parseInt(user.getName())) {
System.out.println("不一致事故出现:"+user.toString());
}
}
Thread.yield();
}
}
}
public static void main(String args[]) throws InterruptedException {
new ReadObjectThread().start();
while (true) {
Thread thread = new ChangeObjectThread();
thread.start();
Thread.sleep(150);
thread.stop();
}
}
}
代码结果
分析一波;就是ChangeObjectThread 中当id设值之后,name没设值之前这个空档,如果调用stop方法,那么此ChangeObjectThread 对应的锁就会释放,那么读线程ReadObjectThread就可能读到最新的ID和上一次的旧NAME
解决方案1:在ChangeObjectThread 中增加新的stop方法newStop
解决方案二:使用Thread.interrupt