記錄一次碰到的併發安全問題

2021-10-02 09:29:15 字數 2006 閱讀 9472

還未進行生產測試,若存在問題請指出。

兩個執行緒a,b。共享乙個arraylist

執行緒a接收資料,addarraylist,根據列表中的記錄條數決定是否傳送到中間儲存件。

執行緒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...