public class DirtyRead {
private String username = "xxoo";
private String password = "1234";
/**
* 这是一个同步方法
*/
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 = " + username + ", password = " + password);
}
public static void main(String[] args) throws InterruptedException {
final DirtyRead dr = new DirtyRead();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
dr.setValue("王五", "909090");
}
});
t1.start();
Thread.sleep(1000);
dr.getValue();
}}
运行结果:
上述代码可以发现t1线程执行setValue 方法时,主线程随后去调用getValue方法。读取出来的数据只有username改变了,但是password没变。获取了一个意料之外的结果。
这个原因是setValue是个同步方法,getValue是个异步方法。且在两个线程调用一个对象的两个方法时,导致了数据不一致,这就是所谓的脏读。
为了结果一致性,我们需要在getValue方法上也加上synchronized 修饰。保证业务的一致性。