線程學習記錄03-臟讀

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 修飾。保證業務的一致性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容