髒讀出現的背景:大多是因為在開發中沒有考慮到業務整體性的原因,導致資料出現了不一致的狀況。
示例:例如我現在有個類,類中有設定值(設定值的過程需要3秒鐘)和取值的方法,然後我在主線程中先設定這個類物件的值,然後讓主線程睡眠1秒鐘之後,馬上去取值。由於設定值的過程需要3秒鐘,也就是我還沒有設定完成,你就過來取值,這時候就會出現髒讀的現象。
看具體**:
package com.tgb.thread;
/** * created by oxj on 2017/8/9.
*/public class dirtyread
public /*synchronized*/ void setvalue(string username,int password) catch (interruptedexception e)
this.password=password;
system.out.println("setvalue的最終結果:"+username+" "+password);
}public static void main(string args)
}).start();
try catch (interruptedexception e)
dirtyread.getvalue();}}
再看看這種情況下的執行效果:
從這個結果中我們可以看出在setvalue的過程中,去getvalue的時候發現人名發生的變化,本應該是李四的,可由於髒讀出現了,成了張三。
那如何避免髒讀的現象呢?究其本源髒讀存在的本身就是由於多執行緒同時讀寫的問題引起的,知道了這個,我們只要將讀寫的方法上加上乙個synchronized關鍵字,就可以避免。
看加上關鍵字synchronized之後的效果:
多個執行緒訪問避免髒讀
package com.freeflying.thread.base classname datashare description 多個執行緒訪問乙個變數,如果多個執行緒同時訪問,避免資料髒讀問題 author freeflying date 2018年6月22日 public class dat...
Synchronize讀髒解決
對於業務需要同步的 同時,新增synchronize關鍵字 比如,在getvalue setvalue方法上 都加上synchronize關鍵字 保證,業務的一致性 package com.bjsxt.base.sync004 業務整體需要使用完整的synchronized,保持業務的原子性。pub...
髒讀,不可重複的讀,虛讀
引用 髒讀dirty reads 當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說 transaction 1 修改了一行資料,然後 transaction 2 在 transaction 1 還未提交修改操作之前讀取了被修改的行。如果 transaction 1 回滾了修改操作,那麼 tr...