汚読一

3763 ワード

オブジェクトの同期と非同期の方法について、私たちは自分のプログラムを設計する時、必ず問題の全体を考慮しなければなりません.そうしないと、データが一致しない場合があります.古典的な間違いは汚い読みです.
package com.ljq.test;

/**
 *            synchronized,        。
 * 
 */
public class DirtyRead {
    private String username = "bjsxt";
    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 synchronized 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("z3", "456");
            }
        });
        t1.start();
        Thread.sleep(1000);

        dr.getValue();
    }

}

a、getValueメソッドsynchronizedキーワードを削除し、コンソール印刷情報:getValueメソッド得:username=z 3、password=123 setValue最終結果:username=z 3、password=456
b、getValueメソッドにsynchronizedキーワードを加え、コンソール印刷情報:setValue最終結果:username=z 3、password=456 getValueメソッド得:username=z 3、password=456
例のまとめ:オブジェクトのメソッドをロックする場合、setValue/getValueメソッドにsynchronized同期キーワードを同時にロックし、ビジネス(service)の原子性を保証する必要があります.そうしないと、ビジネスエラー(側面からビジネスの一貫性も保証されます)が発生します.
acid:データベーストランザクションが正しく実行される4つの要素、原子性、一貫性、隔離性、持続性