執行緒髒讀「程式設計教學」

2021-12-29 19:58:49 字數 1016 閱讀 1414

髒讀出現的背景:大多是因為在開發中沒有考慮到業務整體性的原因,導致資料出現了不一致的狀況。

示例:例如我現在有個類,類中有設定值(設定值的過程需要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...