JUC 併發程式設計 應用

2021-10-06 01:15:57 字數 3507 閱讀 4725

2. 限制對共享資源的使用

快取統籌

定時sleep 實現

在沒有利用 cpu 來計算時,不要讓 while(true) 空轉浪費 cpu,這時可以使用 yield 或 sleep 來讓出 cpu 的使用權

給其他程式

while

(true

)catch

(interruptedexception e)

}

semaphore 實現
@slf4j

(topic =

"c.pool"

)class

pool

}// 6. 借連線

public connection borrow()

catch

(interruptedexception e)

for(

int i =

0; i < poolsize; i++)"

, connections[i]);

return connections[i];}

}}// 不會執行到這裡

return null;

}// 7. 歸還連線

public

void

free

(connection conn)

", conn)

; semaphore.

release()

;break;}}}}

更新時,是先清快取還是先更新資料庫

先清快取

先更新資料庫

補充一種情況,假設查詢執行緒 a 查詢資料時恰好快取資料由於時間到期失效,或是第一次查詢

這種情況的出現機率非常小,見 facebook **

使用讀寫鎖實現乙個簡單的按需載入快取

class

genericcacheddao

finally

}public t queryone

(class

beanclass, string sql, object.

.. params)

}finally

// 加寫鎖, 防止其它執行緒對快取讀取和更改

lock.

writelock()

.lock()

;try

return value;

}finally

}// 作為 key 保證其是不可變的

class

sqlpair

@override

public

boolean

equals

(object o)

if(o == null ||

getclass()

!= o.

getclass()

) sqlpair sqlpair =

(sqlpair) o;

return sql.

equals

(sqlpair.sql)

&& arrays.

equals

(params, sqlpair.params);}

@override

public

inthashcode()

}}

注意樂觀鎖實現:用 cas 去更新

解法1:join

public

static

void

main

(string[

] args)

throws exception

,"老王");

thread t2 =

newthread((

)->

catch

(interruptedexception e)

log.

debug

("泡茶");

},"小王");

t1.start()

; t2.

start()

;}

輸出:

16:56

:04:570

[小王] c.test - 洗茶壺16:

56:04:

570[老王] c.test - 洗水壺16:

56:05:

574[小王] c.test - 洗茶杯16:

56:05:

574[老王] c.test - 燒開水16:

56:07:

574[小王] c.test - 拿茶葉16:

56:20:

574[小王] c.test - 泡茶

解法1 的缺陷:

如何讓每週四 18:00:00 定時執行任務?

// 獲得當前時間

localdatetime now = localdatetime.

now();

// 獲取本周四 18:00:00.000

localdatetime thursday =

now.

with

(dayofweek.thursday)

.withhour(18

).withminute(0

).withsecond(0

).withnano(0

);// 如果當前時間已經超過 本周四 18:00:00.000, 那麼找下周四 18:00:00.000

if(now.

compareto

(thursday)

>=0)

// 計算時間差,即延時執行時間

long initialdelay = duration.

between

(now, thursday)

.tomillis()

;// 計算間隔時間,即 1 周的毫秒值

long oneweek =7*

24*3600

*1000

;scheduledexecutorservice executor = executors.

newscheduledthreadpool(2

);system.out.

println(+

newdate()

);executor.

scheduleatfixedrate((

)->

, initialdelay, oneweek, timeunit.milliseconds)

;

JUC併發程式設計

併發程式設計的本質 充分利用cpu的資源 執行緒就是乙個單獨的資源類,沒有任何的附屬操作。傳統的synchronize鎖本質 佇列,鎖 lock.lock 加鎖 trynew reentrantlock lock.lock 加鎖 finally lock.unlock 解鎖鎖是什麼,如何判斷鎖的是誰...

juc併發程式設計

public class thraedtest string.valueof i start countdownlatch.await system.out.println 關門結束 訊號量通常用來限制執行緒數,比如限流,而不是訪問某些 物理或邏輯 資源。例如,這是乙個使用訊號量來控制對乙個專案池的...

JUC併發程式設計

juc本階段學習介紹 執行緒和程序 回顧多執行緒 傳統的synchronized鎖 lock鎖 synchronized和lock區別 傳統的生產者消費者問題 防止虛假喚醒 lock版的生產者消費者問題 condition實現精準通知喚醒 八鎖現象徹底理解鎖 copyonwritearraylist...