脏读

/**
 * 业务整体需要使用完整的synchronized,保持业务的原子性。
 *
 */
public class DirtyRead {

    private String username = "name1";
    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("name2", "456");        
            }
        });
        t1.start();
        Thread.sleep(1000);
        
        dr.getValue();
    }
}

上述的代码会发生脏读的问题,解决的办法是在setValue的方法上加synchronized关键字

读取和设置的数据必须保证是一致的。

这和数据库的一致性原理是一样的。

原文地址:https://www.cnblogs.com/dongdone/p/5709394.html