public class Readable {
private String username="A";
private String password="AA";
synchronized public void setValue(String username,String password) throws InterruptedException{
this.username=username;
Thread.sleep(5000);
this.password=password;
}
public void getValue(){
System.out.println(this.username+":"+this.password);
}
}
public class Pava extends Thread{
private Readable readable=null;
public Pava(Readable readable) {
this.readable=readable;
}
public void run() {
try {
readable.setValue("B", "BB");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
Readable readable =new Readable();
Pava runnable = new Pava(readable);
runnable.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readable.getValue();
}
}
结果:B:AA
分析 脏读是通过synchronized关键字解决的,当第一个线程获得了任务的写锁之后,正在写,还没写完的时候,第二个线程来读了,此时他读到的并不是真实的数据,原因是第一个线程的整个事务还没有完成,要解决这样的问题,就应该在getValue()方法上加上synchronized关键字,这也充分说名了syn加在方法上充当的是对象级别的锁。两个一起锁起来才能真正实现事务的原子性。