?? ?? ????: java ?? ????
?? ?? ? ??? ??? ??
- ?? ??? ??
- ?? ??
- ??? ? ???? ???
- ??? ??? ? ??? ??
- ??? ? ??? ??? ?? ??
- ??? ?? ???? ?? ??
?? ??? ??
?? ??? ? ??:
/* 真正的多線程開發(fā),公司中的開發(fā),降低耦合性 線程就是一個(gè)單獨(dú)的資源類,沒有任何附屬的操作 1.屬性,方法 ?*?*/public?class?SaleTicketDemo1?{ ????public?static?void?main(String[]?args)?{ ????????//并發(fā),多個(gè)線程操作同一個(gè)資源類,把資源類丟入線程 ????????Ticket?ticket=new?Ticket(); ????????//Runnable借口是一個(gè)FunationalInterface函數(shù)式接口,接口可以new,jdk1.8以后,lamda表達(dá)式()->{代碼} ????????new?Thread(()->{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i0){ ????????????System.out.println(Thread.currentThread().getName()+"賣出了"+(number--)+"票,剩余"+number); ????????} ????}}
? ?? ???? ???? ?????. ?? ???? ?? ??? ??? Java ?? - ?? ???
? ?????. ?? ???? ???? ?? ???? ???? ???? ????. ?? ?????? ?? ? ?? ?? ????. ???? ??? ?? ??? ????. ? ??? ?? ???? ????? ?? ??? ???? ?? ? ????.
?? ????? JVM? ??? ?? ?? ???? ???? ?? ? ??? ???? ??? ? ??? ???? ?? ???? ???? ?????. jdk1.5 ?? JAVA??? ???? ??? ??? ???? ?? Lock ???? ???? ??? ? ??? ???? ?? Condition? ?????.
Lock ???? Java ????? ???? ???, ??? API? ?? Lock ???? ??? ??? ??? ????? ??????.
java.util.Concurrent ????? ??? ??(?? ??)? 3?? ?????? ????. ReadWriteLock
Lock ??? ???? ??? ? ?? ???? ?? ? ?? ??? ? ?? ??? ?? ??? ?????. ?? ??? ???? ???? ??? ?? ??? ?? ? ??? ?? ?? ?? ??? ??? ? ????. Lock?l?=?...;?l.lock();?try?{?//?access?the?resource?protected?by?this?lock?}?finally?{?l.unlock();?}
JDK ?? ??? ???? ????. ??? ?? ?? ???:
ReentrantLock ReentrantLock
ReentrantReadWriteLock.ReadLock ?? ?? ReentrantReadWriteLock . writeLock ?? ??
?? ReentrantLock ?? ???? ?? ???? ?????.
??? ??: ?? ???? ??????. ??? ??? 3s? 3h ????? ???? 3h? ?? ??, ? ?? 3s? 3h? ????? ???, ?? ??? ?? ????. ??? ??: ?? ?????? ?? ?? ???(???)
??? ??? ??? ???????.
//lock trilogy
//1.new ReentranLock() ??? //2.Lock.lock() lock
//3. finally(); Unlockpublic?class?SaleTicketDemo2?{
public?static?void?main(String[]?args)?{
//并發(fā),多個(gè)線程操作同一個(gè)資源類,把資源類丟入線程
Ticket?ticket=new?Ticket();
//Runnable借口是一個(gè)FunationalInterface函數(shù)式接口,接口可以new,jdk1.8以后,lamda表達(dá)式()->{代碼}
new?Thread(()->{for(int?i=0;i{for(int?i=0;i{for(int?i=0;i0){
System.out.println(Thread.currentThread().getName()+"賣出了"+(number--)+"票,剩余"+number);
}
}?catch?(Exception?e)?{
//?TODO:?handle?exception
}finally{
lock.unlock();
}
}}
1. ???? ??? Java ????? ??? Java ??????
2. ???? ?? ??? ??? ? ????. ??? ?????? ????? 3. ???? ???? ??? ?????(a–). ??? ???? ???? ???! ??? ???? ??? ?? ??? ?????
4. ???? ??? 1(?? ??, ??), ??? 2(??, ???? ??)
lock.tryLock()? ??? ????? ????? ???? ?? ? ????. ???
5. ???? ??? ??, ???, ??? ??. ??, ??? ??, ?? ?? ??, ??/??? ?? ?? ??(?? ?? ??)
6. ???? ?? ?? ?? ??? ??? ????, ?? ??? ??? ?? ???? ?? ??? ??
???? ?? ?? ? ???? ?? ?? ??
???? ???? ???? ?? ???? ??, ?? ??? ? ??? ???? ???? ?????.
??? ??? ??? ??? ??? ??? ?? ???? ?? ?? ??????. ??? ?? ???? ?? ??:
??? ?? + ?? ???? + ??? ??? + ?? ??
??? ??? ??? ??? ??
??? A B? ??? ???? ??? ?? ??? ??=0 A num+1
B num-1
??: ?? ???? ?? ????? ?? + ???? + ??package?testConcurrent;/*
線程之間的通信問題:生產(chǎn)者和消費(fèi)者問題????等待喚醒,通知喚醒
線程交替執(zhí)行?A?B?操作同一個(gè)變量number=0
A?num+1
B?num-1
?*?*/public?class?A?{
public?static?void?main(String[]?args)?{
Data?data?=new?Data();
new?Thread(()->{
for(int?i=0;i{
for(int?i=0;i"+number);
//通知其他線程,我+1完畢了
this.notify();
}
//-1
public?synchronized?void?decrement()?throws?InterruptedException{
if(number==0){
//等待
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+"=>"+number);
//通知其他線程,我-1完畢了
this.notify();
}}
? ???? ????. ??? ????? ??? ??? ??? ? ??? ??? ???? ? ? ? ???? ??? ??? ????.
new?Thread(()->{ for(int?i=0;i{ for(int?i=0;i<p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/052/4011c6e510a595c0afc39326e031cf33-4.png" class="lazy" alt="Java? ?? ? ???-??? ??? ???"><br> 這里結(jié)果中出現(xiàn)了2,輸出結(jié)果出現(xiàn)了問題。為什么呢?<br> 為什么if判斷會出現(xiàn)問題:<br> if判斷只判斷一次。因?yàn)閕f判斷了之后,就已經(jīng)進(jìn)入了代碼的等待那一行,這時(shí),在wait下的線程可能有多個(gè),甚至包括生產(chǎn)者和消費(fèi)者。有可能某個(gè)生產(chǎn)者執(zhí)行完了之后,喚醒的是另一個(gè)生產(chǎn)者。</p><p>在我們的官方文檔中就給出了解釋</p><pre class="brush:php;toolbar:false">public?final?void?wait(long?timeout) ????????????????throws?InterruptedException
導(dǎo)致當(dāng)前線程等待,直到另一個(gè)線程調(diào)用此對象的notify()方法或notifyAll()方法,或指定的時(shí)間已過。
線程也可以喚醒,而不會被通知,中斷或超時(shí),即所謂的虛假喚醒 。 雖然這在實(shí)踐中很少會發(fā)生,但應(yīng)用程序必須通過測試應(yīng)該使線程被喚醒的條件來防范,并且如果條件不滿足則繼續(xù)等待。 換句話說,等待應(yīng)該總是出現(xiàn)在循環(huán)中,就像這樣:
?synchronized?(obj)?{ ?????????while?(<condition>) ?????????????obj.wait(timeout); ?????????...?//?Perform?action?appropriate?to?condition ?????}</condition>
注意點(diǎn):防止虛假喚醒問題。
我們代碼中用的是if判斷,而應(yīng)該用while判斷
package?testConcurrent;/* 線程之間的通信問題:生產(chǎn)者和消費(fèi)者問題????等待喚醒,通知喚醒 線程交替執(zhí)行?A?B?操作同一個(gè)變量number=0 A?num+1 B?num-1 ?*?*/public?class?A?{ ????public?static?void?main(String[]?args)?{ ????????Data?data?=new?Data(); ????????new?Thread(()->{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i"+number); ????????//通知其他線程,我+1完畢了 ????????this.notify(); ????} ????//-1 ????public?synchronized?void?decrement()?throws?InterruptedException{ ????????while(number==0){ ????????????//等待 ????????????this.wait(); ????????} ????????number--; ????????System.out.println(Thread.currentThread().getName()+"=>"+number); ????????//通知其他線程,我-1完畢了 ????????this.notify(); ????}}
Lock版的生產(chǎn)者和消費(fèi)者問題
在synchronized版本中,我們使用了wait和notify來實(shí)現(xiàn)線程之間的同步
在lock中,
此時(shí)synchronized被lock替換了,那么wait和notify用什么來替換呢?
我們在官方文檔java.util.concurrent.locks 中,找到Lock類,然后在底部找到了
Condition newCondition()
返回一個(gè)新Condition綁定到該實(shí)例Lock實(shí)例。
在等待條件之前,鎖必須由當(dāng)前線程保持。 呼叫Condition.await()將在等待之前將原子釋放鎖,并在等待返回之前重新獲取鎖。
然后我們再來了解Condition類
Condition 將 Object 監(jiān)視器方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實(shí)現(xiàn)組合使用,為每個(gè)對象提供多個(gè)等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監(jiān)視器方法的使用。
一個(gè)Condition實(shí)例本質(zhì)上綁定到一個(gè)鎖。 要獲得特定Condition實(shí)例的Condition實(shí)例,請使用其newCondition()方法。
我們可以看到,使用的時(shí)候new一個(gè)Condition對象。然后用await替代wait,signal替換notify
代碼實(shí)現(xiàn)
//判斷等待+業(yè)務(wù)+通知
class?Data2{ //數(shù)字。資源類 private?int?number=0; Lock?lock=new?ReentrantLock(); Condition?condition=lock.newCondition(); //+1 public?void?increment()?throws?InterruptedException{ try?{ lock.lock(); //業(yè)務(wù)代碼 while(number!=0){ //等待 condition.await(); } number++; System.out.println(Thread.currentThread().getName()+"=>"+number); condition.signalAll(); //通知 }?catch?(Exception?e)?{ //?TODO:?handle?exception }finally{ lock.unlock(); } } //-1 public?void?decrement()?throws?InterruptedException{ try?{ lock.lock(); //業(yè)務(wù)代碼 while(number!=1){ //等待 condition.await(); } number--; System.out.println(Thread.currentThread().getName()+"=>"+number); condition.signalAll(); //通知 }?catch?(Exception?e)?{ //?TODO:?handle?exception }finally{ lock.unlock(); } } }
注意:主函數(shù)部分于最上面的代碼一樣。
這時(shí)候雖然說是正確的,但是它是一個(gè)隨機(jī)分布的狀態(tài),現(xiàn)在我們希望它有序執(zhí)行,即A執(zhí)行完了執(zhí)行B,B執(zhí)行C,C完了執(zhí)行D。即精準(zhǔn)通知。
Condition實(shí)現(xiàn)精準(zhǔn)通知喚醒
Condition實(shí)現(xiàn)精準(zhǔn)的通知和喚醒
我們構(gòu)造三個(gè)線程,要求A執(zhí)行完了執(zhí)行B,B執(zhí)行完了執(zhí)行C,C執(zhí)行完了執(zhí)行D.
代碼思想:
//加多個(gè)監(jiān)視器,通過監(jiān)視器來判斷喚醒的是哪一個(gè)人
//設(shè)置多個(gè)同步監(jiān)視器,每個(gè)監(jiān)視器監(jiān)視一個(gè)線程
//實(shí)例:生產(chǎn)線,下單->支付->交易->物流
package?testConcurrent;import?java.util.concurrent.locks.Condition;import?java.util.concurrent.locks.Lock;import?java.util.concurrent.locks.ReentrantLock;/* A執(zhí)行完調(diào)用B,B執(zhí)行完調(diào)用C,C執(zhí)行完調(diào)用A ?*?*/public?class?C?{ ????public?static?void?main(String[]?args)?{ ????????Data3?data=new?Data3(); ????????new?Thread(()->{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i{ ????????????for(int?i=0;i支付->交易->物流 ????private?Condition?condition1=lock.newCondition(); ????private?Condition?condition2=lock.newCondition(); ????private?Condition?condition3=lock.newCondition(); ????private?int?number=1;???????//1A?2B?3C ????public?void?printA(){ ????????lock.lock(); ????????try?{ ????????????//業(yè)務(wù),判斷->執(zhí)行->通知 ????????????while(number!=1){ ????????????????//等待 ????????????????condition1.await(); ????????????} ????????????System.out.println(Thread.currentThread().getName()+"=>AAAAAAA"); ????????????//喚醒,喚醒指定的人,B ????????????number=2;???????????//精準(zhǔn)喚醒 ????????????condition2.signal(); ???????????? ????????}?catch?(Exception?e)?{ ????????????//?TODO:?handle?exception ????????}finally{ ????????????lock.unlock(); ????????} ????}??? ????public?void?printB(){ ????????lock.lock(); ????????try?{ ????????????//業(yè)務(wù),判斷->執(zhí)行->通知 ????????????while(number!=2){ ????????????????//等待 ????????????????condition2.await(); ????????????} ????????????System.out.println(Thread.currentThread().getName()+"=>BBBBBBB"); ????????????//喚醒,喚醒指定的人,C ????????????number=3;???????????//精準(zhǔn)喚醒 ????????????condition3.signal(); ???????????? ????????}?catch?(Exception?e)?{ ????????????//?TODO:?handle?exception ????????}finally{ ????????????lock.unlock(); ????????} ????} ????public?void?printC(){ ????????lock.lock(); ????????try?{ ????????????//業(yè)務(wù),判斷->執(zhí)行->通知 ????????????while(number!=3){ ????????????????//等待 ????????????????condition3.await(); ????????????} ????????????System.out.println(Thread.currentThread().getName()+"=>CCCCCCC"); ????????????//喚醒,喚醒指定的人,A ????????????number=1;???????????//精準(zhǔn)喚醒 ????????????condition1.signal(); ???????????? ????????}?catch?(Exception?e)?{ ????????????//?TODO:?handle?exception ????????}finally{ ????????????lock.unlock(); ????????} ????}}
相關(guān)學(xué)習(xí)推薦:java基礎(chǔ)
? ??? Java? ?? ? ???-??? ??? ???? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

JDBC ????? ???? ????? ?? ?? ?? ??? ?? ?? ??? ?? ? ?? ??? ?? ?? ?? ??? ???????. 1. ????? ????? Conn.SetAutoCommit (False)?? ??????. 2. ??? ? ????? ?? ?? SQL ??? ?????. 3. ?? ??? ??? ?? Conn.commit ()?? ???? ??? ???? ???? ?? ??? ???? Conn.Rollback ()?? ??????. ???, ? ??? ???? ????, ??? ???? ????, ?? ??? ??? ?? ??? ??? ???? ? ???????. ?? ?? ?? ???? ????? ??? ???? ?? ?? ???? ???? ??? ????? ?? ??? ??? ? ?? ???? ?? ????.

?? ?? ? ?? ???? ???? ?? Java.Time ???? ???? ??????. 2. LocalDate, LocalDateTime ? LocalTime? ?? ?? ??? ??? ?????. 3. () ???? ???? ?? ??? ??? ????. 4. ???/???? ??? ???? ??? ????? ??? ??????. 5. ZonedDateTime ? Zoneid? ???? ???? ??????. 6. DateTimeFormatter? ?? ?? ? ?? ?? ?? ???; 7. ??? ?? ?? ?? ??? ????? ?? ??????. ?? Java? ?? ??? ???? ??? ??? ???? Java.Timeapi ??? ?? ??? ???????.

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

GO? HTTP ?? ????? ?? ??, ??, ????? IP ? ?? ??? ?? ? ? ????. 1. http.handlerfunc? ???? ????? ????, 2. ??? ???? ?? ?? ??? ?? ??? ??????. ?? ?? ??? ???? ??? ?????? ??? ????? ???? ? ?????. ?? ???? ?? ?? ??, JSON ?? ?? ? ?? ID ??? ?????.

Java 's Garbage Collection (GC)? ???? ???? ???? ??????, ?? ? ??? ??? ? ??? ??? ??? ??? ????. 1.GC? ?? ?? (? : ?? ??, ?? ???, ?? ?? ?)?? ??? ???? ????, ?? ? ??? ??? ???? ?????. 2. ?? ???? ????? ????, ?? ?? ??? ??? ???? ?? ??? ??????. 3. ?? ?? ?? ?? : ??? ?? (Eden, S0, S1)? ?? ????? ?????. ??? ??? ?? ? MajorGC? ???? ? ??? ? ????. Metaspace? ??? ?? ???? ?????. 4. JVM? ??? GC ??? ?????. SerialGC? ??? ?? ????? ?????. ParallelGC? ???? ??????. CMS? ?? ???

??? htmlinput ??? ???? ??? ???? ????? ??? ??? ?? ??? ???? ???? ? ????. 1. ???, ???, ??, ?? ? ??? ?? ??? ??? ?? ?? ?? ??? ???? ???? ??? ? ???? ??? ? ????. 2. HTML5? ?????? ??? ? ?? ?? ??? ?? ? ??? URL, ??, ?? ? ??? ?? ??? ??? ??????. 3. ?? ?? ? ? ??? ??? ???? ?? ??? ???? ???? ?? ???? ?? ???? ???? ?? ? ? ??? ?? ???????.

GradleisBetTerChoiceFormostNewProjectSduetoitssuperiorflexible, Performance, and ModernToolingsupport.1.Gradle'Sgroovy/kotlindslismoreConcisENDEXPRESSIVETHANMAVEN'SVOSEXML.2.GradleOutsMaveninbuildweedweedweedweedweedweedweedweedweedweedweedweedweedweede

DEFER? ??? ???? ?? ??? ??? ???? ? ?????. ?? ??? ?? ? ? ?? ????, ??? ??? ? ?? ?? (LIFO)? ??? ?????. 1. ?? ??? ??? ? ??? ?????. 2. ?? ??? ?? ??? ??? ????? ?????. 3. ?? ? ?? ?? ??? ? ????. 4. ??? ?????? ??? ??? ???? ?????. 5. ?? ??? ???? ?? ??? ?? ??? ?????. ??? ??? ?? ?? ? ???? ???? ? ????.
