我們可以先用所學知識來寫乙個
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...