脏读
臟讀就是指當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據,那么另外一個事務讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的。
public class Dirtyread {
private String userName="pdz";
private String password="12345";
public synchronized void updateUser(String userName, String password) {
this.userName = userName;
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.password = password;
System.out.println("更新用戶信息姓名為:" + userName + "密碼為:" + password);
}
public void queryUser() {
System.out.println("獲取用戶信息姓名:" + userName + "密碼:" + password);
}
public static void main(String[] args) {
final Dirtyread dirtyread = new Dirtyread();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
dirtyread.updateUser("張三", "111111");
}
});
t1.start();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
dirtyread.queryUser();
}
}
上述代碼中我們有一個線程t1和主線程main。為了放置更新用戶數據出現沖突,所以我們把updateUser方法進行了同步。當程序運行后,結果:
獲取用戶信息姓名:張三密碼:12345 更新用戶信息姓名為:張三密碼為:111111
我們獲取的信息并不是完全修改后的信息。而是密碼還是原來的密碼,而姓名卻是修改后的密碼。這就是臟讀。因為對象的屬性帳號和密碼在更新方法和獲取方法之中,我們都是資源共享。也就是說多個線程在執行不同的方法的時候,都是共享這兩個屬性的值。所以必須要對這兩個方法都進行同步。解決方法就是queryUser方法也進行synchronizedx修飾。
總結
- 上一篇: List集合的总结和应用场景的介绍
- 下一篇: WIFI协议详解