執行緒範圍內共享資料

2021-08-11 18:24:19 字數 2520 閱讀 7274

我們可以先用所學知識來寫乙個

public

class threadscopesharedata

}).start();}}

static class a

}static class b}}

如果光像上面這樣寫的話,那毫無疑問,肯定是有問題的,如下圖所示並沒有實現執行緒共享

此時就實現執行緒內共享資料了

public

class threadscopesharedata

}).start();}}

static class a

}static class b}}

a.訂單處理包含一系列操作

減少庫存量,增加一條流水台賬,修改總賬,這幾個操作要在同乙個事務中完成,通常也即同乙個執行緒中進行處理,如果累加公司應收款的操作失敗了,則應該把前面的操作回滾,否則,提交所有操作,這要求這些操作使用相同的資料庫連線物件,而這些操作的**分別位於不同的模組類中

b.銀行轉賬包含一系列操作

把轉出賬戶的月減少,把轉入賬戶的餘額增加,這兩個操作要在同乙個事務中完成,它們必須使用相同的資料庫連線物件,轉入和轉出操作的**分別是兩個不同的賬戶物件的方法

c.例如struts2的actioncontext

同一段**被不同的執行緒呼叫執行時,該**操作的資料是每個執行緒各自的狀態和資料,對於不同的執行緒來說,getcontext方法拿到的物件都不相同,對同乙個執行緒來說,不管呼叫getcontext方法多少次和在哪個模組中getcontext方法,拿到的都是同乙個

總結

乙個threadlocal代表乙個變數,故其中裡只能放乙個資料,你有兩個變數都要執行緒範圍內共享,則要定義兩個threadlocal物件.如果有一百個變數要執行緒共享呢?請先定義乙個物件來裝這一百個變數,然後在threadlocal中儲存這一物件

你首先就會想要把這一百個資料封裝成乙個物件

public

class threadlocaltest

}).start();}}

static class a

}static class b

}}class mythreadscopedata

public

void

setname(string name)

public

intgetage()

public

void

setage(int age)

}

public

class threadlocaltest

}).start();}}

static class a

}static class b

}}class mythreadscopedata

public

static /*synchronized*/ mythreadscopedata getthreadinstance()

return instance;

//飢漢模式如果在多執行緒模式下,必須方法上加上互斥

/*if(instance == null)

return instance;*/

}private

static mythreadscopedata instance = new mythreadscopedata();//別人還沒呼叫instance,它就已經new出來了

//private static mythreadscopedata instance = null;飢漢模式

private

static threadlocalmap = new threadlocal();

private string name;

private

int age;

public string getname()

public

void

setname(string name)

public

intgetage()

public

void

setage(int age)

}

執行緒範圍內共享資料

假設現在有個公共的變數data,有不同的執行緒都可以去操作它,如果在不同的執行緒對data操作完成後再去取這個data,那麼肯定會出現執行緒間的資料混亂問題,因為a執行緒在取data資料前可能b執行緒又對其進行了修改,下面寫個程式來說明一下該問題 public class threadscopesh...

執行緒範圍內共享資料ThreadLocal

原始碼 private t setinitialvalue 1 原始版本 public class threadlocaltestbefore start new thread new runnable start a b類分別為使用執行緒區域性變數的資料 static class a static...

執行緒範圍內共享資料的例子

設計四個執行緒,其中兩個執行緒每次給增加j增加一,另外兩個給j減一。設計四個執行緒,其中兩個執行緒每次給增加i增加一,另外兩個給i減一。方式一 呼叫兩個繼承了runnable類的類進行資料的加減操作 public class threadscopedatatest static class incr...