美文网首页
线程学习记录03-脏读

线程学习记录03-脏读

作者: 绝世懒人 | 来源:发表于2017-06-21 14:04 被阅读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 修饰。保证业务的一致性。

    相关文章

      网友评论

          本文标题:线程学习记录03-脏读

          本文链接:https://www.haomeiwen.com/subject/jezzqxtx.html