對于對象的同步和異步的方法,我們在設計自己程序的時候,一定要考慮問題的整體性,不然就會出現數據不一致的錯誤,臟讀。
看代碼
/**
* 業務整體需要使用完整的synchronized,保持業務的原子性。
*/
public class DirtyRead {
private String username = "helei";
private String password = "123";
public synchronized void setValue(String username, String password){
//傳兩個參數,對成員變量修改
this.username = username;
try {
Thread.sleep(2000);//先對用戶名進行了一個設置,2秒鐘以后,又對密碼進行設置一次
} 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();//實例化一個對象,啟動一個t1線程,
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
dr.setValue("helei", "456");
}
});
t1.start();
Thread.sleep(1000);
dr.getValue();
}
}
打印結果如下
那好我們分析下
主要有兩個縱向線程,首先是一個主線程main,還有一個t1線程,t1執run方法,等待兩秒鐘
如果打印是 helei 123的話,代碼中的邏輯剛執行一半,我不希望有其他線程進來,那么我們應該考慮問題的時候考慮問題的整體性, 也就是在setValue不允許getValue執行,就把兩個方法上都加上synchronized
總結:在我們對一個對象的方法加鎖的時候,需要考慮業務的整體性,即為setValue和getValue同時加鎖synchronized同步關鍵字,保證業務的原子性,不然會出現業務錯誤。(也從側面保證業務的一致性)
關系型數據庫的四個特性
- A原子性
-
C一致性
- I隔離性
- D永久性