汚読一
3763 ワード
オブジェクトの同期と非同期の方法について、私たちは自分のプログラムを設計する時、必ず問題の全体を考慮しなければなりません.そうしないと、データが一致しない場合があります.古典的な間違いは汚い読みです.
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つの要素、原子性、一貫性、隔離性、持続性
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つの要素、原子性、一貫性、隔離性、持続性