還未進行生產測試,若存在問題請指出。
兩個執行緒a,b。共享乙個arraylist
。
執行緒a接收資料,add
到arraylist
,根據列表中的記錄條數決定是否傳送到中間儲存件。
執行緒b定時執行傳送。
arraylistbuffer
private
final
static
int count =
100;
arraylist<
byte
> buffere =
newarraylist
<
>
(count)
;// 執行緒a
public
void
send
(byte
data)
sendandclear()
;}// 執行緒b:定時任務
public
void
run(
)snedandclear()
;}private
void
sendandclear()
執行緒a執行add()
,執行緒b讀取size()
解決:volatile
新問題:原子性
執行緒a執行add()
,先賦值,後size
++,且均不為原子操作。即出現:執行緒a執行add
後,buffer
中有資料,但執行緒b沒檢測到。
解決:同步集合
public
boolean
add(e e)
後台執行緒b傳送資料時,發完需要clear()
,在序列化後clear
前,執行緒a執行add
新增一條資料到buffer
中,clear
會將這條未傳送的資料也一起清空。
解決:互斥鎖,且不需要同步集合保持方法同步。
public
void
clear()
private
final
static
int count =
100;
volatile arraylist<
byte
> buffere =
newarraylist
<
>
(count)
;private reentrantlock lock =
newreentrantlock()
;// 執行緒a
public
void
send
(byte
data)
while
(!lock.
trylock()
);buffer.
add(data);if
(buffer.
size()
< count )
sendandclear()
;}finally
}// 執行緒b:定時任務
public
void
run(
)while
(!lock.
trylock()
);if(buffer.
size()
==0)snedandclear()
;}finally
}private
void
sendandclear()
併發操作的資料安全問題
多執行緒執行環境下肯定存在併發,會存在乙個物件被多個執行緒同時操作 對同一資料的訪問 的情況,這樣如果不加以控制,很容易存在資料安全問題。下面以乙個銀行轉賬的例子來說明併發可能存在的問題 模擬賬戶 account類 public class account public string getname...
併發程式設計專題(一) 執行緒安全問題
當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。案例 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。public class threadtrain implements...
第一次寫Oracle碰到的問題
今天是第一次寫oracle的儲存過程,由於新手,被一些東西糾結了一天。特此記錄下,讓自己以後不要在犯錯了。1.count 第一次寫oracle的儲存過程,沒什麼經驗,就count 這個問題,讓我正正花費了乙個早上。example create or replace procedure demo id...