1爱谁、Phaser CountDownLatch CyclicBarrier Semaphore
- CountDownLatch
public CountDownLatch(int count) // 構(gòu)造器 倒計(jì)時(shí)的計(jì)數(shù)器
public void await() throws InterruptedException // 這兩個(gè)await方法會(huì)檢測現(xiàn)在count值是否為0慕趴,如果為0則直接返回罚勾,不為0刹帕,則會(huì)將當(dāng)前線程掛起,知道count為0喚醒線程煞赢,返回
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
public void countDown() // 減1 實(shí)現(xiàn)是使用的compareAndSetWaitStatus CAS 負(fù)責(zé)喚醒a(bǔ)wait的線程
應(yīng)用:
等待多個(gè)任務(wù)執(zhí)行完成后,再執(zhí)行一個(gè)任務(wù)
如:以前的app上哄孤,多張圖片同時(shí)上傳照筑,全部上傳完成再后調(diào)用信息上傳接口
- CyclicBarrier
public CyclicBarrier(int parties) // 構(gòu)造器 需要等待多少個(gè)線程到達(dá) cyclic的含義是可復(fù)用
public CyclicBarrier(int parties, Runnable barrierAction)
public int await() // 等待parties個(gè)線程走到這里,然后再一起放行往后
public int await(long timeout, TimeUnit unit)
應(yīng)用:
使用上面那個(gè)barrierAction可以達(dá)到countdown的目的瘦陈。凝危。
如一輛客車必須裝滿才能讓乘客上車,每個(gè)乘客一個(gè)線程晨逝,當(dāng)?shù)竭_(dá)客車容量20人時(shí)蛾默,放開這些乘客,讓他們上車買票坐車咏花。
- Semaphore
public Semaphore(int permits) // 構(gòu)造器 限制同時(shí)通過的數(shù)量趴生,獲取后需要自己釋放 fair指是否是公平鎖即先到先得
public Semaphore(int permits, boolean fair)
public void acquire() throws InterruptedException // 獲取1個(gè)許可 -- 阻塞的,會(huì)一直等待
public void acquire(int permits) throws InterruptedException // 獲取permits個(gè)許可 -- 阻塞的昏翰,會(huì)一直等待
public void release() // 釋放1個(gè)許可
public void release(int permits) // 釋放permits個(gè)許可
// 下面這4個(gè)是非阻塞獲取許可和超時(shí)阻塞獲取
public boolean tryAcquire()
public boolean tryAcquire(long timeout, TimeUnit unit)
public boolean tryAcquire(int permits)
public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException
應(yīng)用:限流請求數(shù)量
- Phaser
public Phaser() // 構(gòu)建相移器苍匆,標(biāo)識需要parties個(gè)到達(dá)才能往下走 可以通過register添加parties的數(shù)量
public Phaser(int parties)
public Phaser(Phaser parent)
public Phaser(Phaser parent, int parties)
public int register() // parties加1
public int arrive()// 只標(biāo)記到達(dá),不等待
public int arriveAndAwaitAdvance() //標(biāo)記到達(dá)并阻塞等待下一階段
public int arriveAndDeregister() //到達(dá)并將自己注銷
可以用多次CyclicBarrier實(shí)現(xiàn)Phaser的階段請求
但是CyclicBarrier不能動(dòng)態(tài)修改parties
應(yīng)用:幾個(gè)人參加多個(gè)運(yùn)動(dòng)比賽棚菊,需要每個(gè)人都到達(dá)浸踩,才能開始短跑比賽,需要每個(gè)人短跑完了统求,才能開始長跑检碗,需要每個(gè)人都長跑完了据块,才能開始跳遠(yuǎn)。折剃。另假。
2、ArrayList的線程安全版本
CopyOnWriteArrayList
Collections.synchronizedList(List list) 返回一個(gè)線程安全的SynchronizedList :實(shí)現(xiàn)synchronized (mutex)
3怕犁、auto increment
mysql
5.1.22 之前 表鎖
5.1.22之后 innodb_autoinc_lock_mode
- 為0時(shí)边篮,跟以前一樣,表鎖
- 為1時(shí)
a簡單插入時(shí)奏甫,根據(jù)要插入的數(shù)量戈轿,計(jì)算出需要分配的id數(shù),只鎖分配id的過程
b insert select 不能直接推測出要插入的數(shù)量阵子,和以前一樣直接鎖表
c INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');
INSERT … ON DUPLICATE KEY UPDATE
不確定最終插入多少條思杯,但是直到最壞條數(shù),所以分配最壞條件下的條數(shù)挠进,只分配id過程鎖住 - 為2時(shí)
不做預(yù)分配色乾,來一個(gè),鎖一個(gè)分配過程
兩個(gè)insert語句的id分配可能會(huì)交叉奈梳,如果做主從的話杈湾,會(huì)導(dǎo)致主從的id不一致
默認(rèn)值時(shí)1
insert 解虱。攘须。。select 會(huì)發(fā)生鎖表