线程学习记录03-脏读

2017-06-21  本文已影响0人  绝世懒人
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();
}}

运行结果:

image.png

上述代码可以发现t1线程执行setValue 方法时,主线程随后去调用getValue方法。读取出来的数据只有username改变了,但是password没变。获取了一个意料之外的结果。
这个原因是setValue是个同步方法,getValue是个异步方法。且在两个线程调用一个对象的两个方法时,导致了数据不一致,这就是所谓的脏读。
为了结果一致性,我们需要在getValue方法上也加上synchronized 修饰。保证业务的一致性。

上一篇下一篇

猜你喜欢

热点阅读