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()
;}
解法1 的缺陷: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 - 泡茶
如何讓每週四 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...