两个线程同时修改共享数据容易产生线程安全问题。如果是在数据库中,一条数据由很多个字段组成,假设一个线程要去修改其中几个字段的值,与此同时有另一个线程想要读取这条数据,那么会产生什么问题呢。
下面的代码中,Student类有学号id、姓名name、专业名dprt三个属性。某同学申请转专业,需要修改他的学号和专业名。修改学号和专业名需要1秒钟完成,同时有另一个线程在查他的信息,查询速度很快。
import static java.lang.Thread.sleep;
public class DirtyRead {
public static void main(String[] args) {
Student student = new Student(105, "Peter", "Physics");
SetInfo setInfo = new SetInfo(student);
GetInfo getInfo = new GetInfo(student);
Thread set = new Thread(setInfo);
Thread get = new Thread(getInfo);
set.start();
get.start();
}
}
class SetInfo implements Runnable{
private Student student;
public SetInfo(Student student){
this.student = student;
}
@Override
public void run() {
student.setInfo(205, "Math");
}
}
class