先看一段代码
public class DirtyRead {
private String username = "yy";
private String password = "123";
public synchronized void setValue(String username, String password){
this.username = username;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.password = password;
System.out.println("setValue最终结果:username = " + username + " , password = " + password);
}
public void getValue(){
System.out.println("getValue方法得到:username = " + this.username + " , password = " + this.password);
}
public static void main(String[] args) throws Exception{
final DirtyRead dr = new DirtyRead();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
dr.setValue("jj", "456");
}
});
t1.start();
Thread.sleep(1000);
dr.getValue();
}
}
输出结果
getValue方法得到:username = jj , password = 123
setValue最终结果:username = jj , password = 456
**问题:username修改之后,还没等到password修改就被读了出来,这就是脏读!
原因是:getValue方法并没有加上锁,所以在setValue执行时getValue同时在执行,所以应该在两个方法都加上Synchronized关键字**