国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

原來在58.新浪對于線程.多線程.線程池的問答

2020-03-03 01:27 作者:初壹十五阿  | 我要投稿

每一次去面試就是一次對自我知識的總結(jié)和審核,如果你想拿到BATJ.58.新浪.華為.小米.字節(jié)等等相關(guān)的大廠的offer.成功的通過一面二面三面四面,那么我分享的面試學(xué)習(xí)路線你可以來參考一下(PDF文檔版見如下)

請查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)

1、開啟線程的三種方式?

1)繼承 Thread 類,重寫 run()方法,在 run()方法體中編寫要完成的任務(wù)?new Thread().start();

2 ) 實 現(xiàn) Runnable 接 口 , 實 現(xiàn) run() 方 法?new Thread(new MyRunnable()).start();

3)實現(xiàn) Callable 接口?MyCallable?類,實現(xiàn) call()方法,使用?FutureTask?類來包裝 Callable 對象,使用?FutureTask?對象作為 Thread 對象的 target 創(chuàng)建并啟動線程;調(diào)用FutureTask?對象的 get()方法來獲得子線程執(zhí)行結(jié)束后的返回值

FutureTask<Integer> ft = new FutureTask<Integer>(new MyCallable());new Thread(ft).start();

2、run()和 start()方法區(qū)別

run()方法只是線程的主體方法,和普通方法一樣,不會創(chuàng)建新的線程。只有調(diào)用 start()方法,才會啟動一個新的線程,新線程才會調(diào)用 run()方法,線程才會開始執(zhí)行。

3、如何控制某個方法允許并發(fā)訪問線程的個數(shù)?

創(chuàng)建?Semaphore?變量,Semaphore semaphore = new Semaphore(5, true);當(dāng)方法進(jìn)入時,請求一個信號,如果信號被用完則等待,方法運行完,釋放一個信號,釋放的信號新的線程就可以使用

4、在 Java 中 wait 和 seelp 方法的不同

wait()方法屬于 Object 類,調(diào)用該方法時,線程會放棄對象鎖,只有該對象調(diào)用?notify()方法后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲取對象鎖進(jìn)入運行狀態(tài)。

sleep()方法屬于 Thread 類,sleep()導(dǎo)致程序暫停執(zhí)行指定的時間,讓出 CPU,但它的監(jiān)控狀態(tài)依然保存著,當(dāng)指定時間到了又會回到運行狀態(tài),sleep()方法中線程不會釋放對象鎖。

5、談?wù)?wait/notify 關(guān)鍵字的理解

notify:?喚醒在此對象監(jiān)視器上等待的單個線程

notifyAll():?通知所有等待該競爭資源的線程

wait:?釋放 obj 的鎖,導(dǎo)致當(dāng)前的線程等待,直接其他線程調(diào)用此對象的?notify()或?notifyAll()方法當(dāng)要調(diào)用 wait()或notify()/notifyAll()方法時,一定要對競爭資源進(jìn)行加鎖,一般放到?synchronized(obj)代碼中。當(dāng)調(diào)用?obj.notify/notifyAll?后,調(diào)用線程依舊持有 obj 鎖,因此等待線程雖被喚醒,但仍無法獲得 obj 鎖,直到調(diào)用線程退出 synchronized 塊,釋放 obj 鎖后,其他等待線程才有機會獲得鎖繼續(xù)執(zhí)行。

6、什么導(dǎo)致線程阻塞?

(1)一般線程阻塞
1)?線程執(zhí)行了?Thread.sleep(int millsecond)方法,放棄 CPU,睡眠一段時間,一段時間過后恢復(fù)執(zhí)行;
2)?線程執(zhí)行一段同步代碼,但無法獲得相關(guān)的同步鎖,只能進(jìn)入阻塞狀態(tài),等到獲取到同步鎖,才能恢復(fù)執(zhí)行;
3)?線程執(zhí)行了一個對象的 wait()方法,直接進(jìn)入阻塞態(tài),等待其他線程執(zhí)行notify()/notifyAll()操作;
4)?線程執(zhí)行某些 IO 操作,因為等待相關(guān)資源而進(jìn)入了阻塞態(tài),如 System.in,但沒有收到鍵盤的輸入,則進(jìn)入阻塞態(tài)。
5)?線程禮讓,Thread.yield()方法,暫停當(dāng)前正在執(zhí)行的線程對象,把執(zhí)行機會讓給相同或更高優(yōu)先級的線程,但并不會使線程進(jìn)入阻塞態(tài),線程仍處于可執(zhí)行態(tài),隨時可能再次分得 CPU 時間。線程自閉,join()方法,在當(dāng)前線程調(diào)用另一個線程的?join()方法,則當(dāng)前線程進(jìn)入阻塞態(tài),直到另一個線程運行結(jié)束,當(dāng)前線程再由阻塞轉(zhuǎn)為就緒態(tài)。
6)?線程執(zhí)行?suspend()使線程進(jìn)入阻塞態(tài),必須?resume()方法被調(diào)用,才能使線程重新進(jìn)入可執(zhí)行狀態(tài)。

7?線程如何關(guān)閉?

1) 使用標(biāo)志位
2)?使用 stop()方法,但該方法就像關(guān)掉電腦電源一樣,可能會發(fā)生預(yù)料不到的問題
3)使用中斷?interrupt()

但調(diào)用?interrupt()方法只是傳遞中斷請求消息,并不代表要立馬停止目標(biāo)線程。

8、講一下 java 中的同步的方法

之所以需要同步,因為在多線程并發(fā)控制,當(dāng)多個線程同時操作一個可共享的資源時,如果沒有采取同步機制,將會導(dǎo)致數(shù)據(jù)不準(zhǔn)確,因此需要加入同步鎖,確保在該線程沒有完成操作前被其他線程調(diào)用,從而保證該變量的唯一一性和準(zhǔn)確性。

1)synchronized 修飾同步代碼塊或方法
由于 java 的每個對象都有一個內(nèi)置鎖,用此關(guān)鍵字修飾方法時,內(nèi)置鎖會保護整個方法。在調(diào)用該方法前,需獲得內(nèi)置鎖,否則就處于陰塞狀態(tài)。

2)volatile 修飾變量
保證變量在線程間的可見性,每次線程要訪問 volatile 修飾的變量時都從內(nèi)存中讀取,而不緩存中,這樣每個線程訪問到的變量都是一樣的。且使用內(nèi)存屏障。

3)?ReentrantLock?重入鎖,它常用的方法有?ReentrantLock():創(chuàng)建一個ReentrantLock?實例lock()獲得鎖?unlock()釋放鎖

4)?使用局部變量?ThreadLocal?實現(xiàn)線程同步,每個線程都會保存一份該變量的副本,副本之間相互獨立,這樣每個線程都可以隨意修改自己的副本,而不影響其他線程。常用方法?ThreadLocal()創(chuàng)建一個線程本地變量;get()返回此線程局部的當(dāng)前線程副本變量;initialValue()返回此線程局部變量的當(dāng)前線程的初始值;set(T value)將此線程變量的當(dāng)前線程副本中的值設(shè)置為 value

5)?使用原子變量,如?AtomicInteger,常用方法?AtomicInteger(int value)創(chuàng)建個有給定初始值的?AtomicInteger?整數(shù);addAndGet(int data)以原子方式將給定值與當(dāng)前值相加

6)?使用阻塞隊列實現(xiàn)線程同步?LinkedBlockingQueue<E>

9、如何保證線程安全?

線程安全性體現(xiàn)在三方法:
1)原子性: 提供互斥訪問,同一時刻只能有一個線和至數(shù)據(jù)進(jìn)行操作。

JDK?中 提 供 了 很 多 atomic 類 , 如AtomicIntege\AtomicBoolean\AtomicLong,它們是通過 CAS 完成原子性。JDK 提供鎖分為兩種:synchronized 依賴 JVM實現(xiàn)鎖,該關(guān)鍵字作用對象的作用范圍內(nèi)同一時刻只能有一個線程進(jìn)行操作。另一種是 LOCK,是 JDK 提供的代碼層面的鎖,依賴 CPU 指令,代表性是ReentrantLock

2)可見性:一個線程對主內(nèi)存的修改及時被其他線程看到。
JVM 提供了 synchronized 和 volatile,volatile 的可見性是通過內(nèi)存屏障和禁止重排序?qū)崿F(xiàn)的,volatile 會在寫操作時,在寫操作后加一條 store 屏障指令,將本地內(nèi)存中的共享變量值刷新到主內(nèi)存;會在讀操作時,在讀操作前加一條load 指令,從內(nèi)存中讀取共享變量

3)有序性:指令沒有被編譯器重排序。
可通過 volatile、synchronized、Lock 保證有序性。

10、兩個進(jìn)程同時要求寫或者讀,能不能實現(xiàn)?如何防止進(jìn)程的同步?

我認(rèn)為可以實現(xiàn),比如兩個進(jìn)程都讀取日歷進(jìn)程數(shù)據(jù)是沒有問題,但同時寫,應(yīng)該會有沖突。
可以使用共享內(nèi)存實現(xiàn)進(jìn)程間數(shù)據(jù)共享。

11、線程間操作 List

12、Java 中對象的生命周期

1)創(chuàng)建階段(Created):?為對象分配存儲空間,開始構(gòu)造對象,從超類到子類對 static 成員初始化;超類成員變量按順序初始化,遞歸調(diào)用超類的構(gòu)造方法,子類成員變量按順序初始化,子類構(gòu)造方法調(diào)用。
2)應(yīng)用階段(In Use):?對象至少被一個強引用持有著。
3)不可見階段(Invisible):?程序運行已超出對象作用域
4)不可達(dá)階段(Unreachable):該對象不再被強引用所持有
5)收集階段(Collected):?假設(shè)該對象重寫了 finalize()方法且未執(zhí)行過,會去執(zhí)行該方法。
6)終結(jié)階段(Finalized):?對象運行完 finalize()方法仍處于不可達(dá)狀態(tài),等待垃圾回收器對該對象空間進(jìn)行回收。
7)對象空間重新分配階段(De-allocated):?垃圾回收器對該對象所占用的內(nèi)存空間進(jìn)行回收或再分配,該對象徹底消失。

13、static synchronized 方法的多線程訪問和作用

static synchronized 控制的是類的所有實例訪問,不管 new 了多少對象,只有一份,所以對該類的所有對象都加了鎖。限制多線程中該類的所有實例同時訪問JVM 中該類對應(yīng)的代碼。

14、同一個類里面兩個 synchronized 方法,兩個線程同時訪問的問題

如果 synchronized 修飾的是靜態(tài)方法,鎖的是當(dāng)前類的 class 對象,進(jìn)入同步代碼前要獲得當(dāng)前類對象的鎖;

普通方法,鎖的是當(dāng)前實例對象,進(jìn)入同步代碼前要獲得的是當(dāng)前實例的鎖;

同步代碼塊,鎖的是括號里面的對象,對給定的對象加鎖,進(jìn)入同步代碼塊庫前要獲得給定對象鎖;

如果兩個線程訪問同一個對象的 synchronized 方法,會出現(xiàn)競爭,如果是不同對象,則不會相互影響。

15、volatile 的原理

有volatile變量修飾的共享變量進(jìn)行寫操作的時候會多一條匯編代碼,lock addl$0x0,lock 前綴的指令在多核處理器下會將當(dāng)前處理器緩存行的數(shù)據(jù)會寫回到系統(tǒng)內(nèi)存,這個寫回內(nèi)存的操作會引起在其他 CPU 里緩存了該內(nèi)存地址的數(shù)據(jù)無效。同時 lock 前綴也相當(dāng)于一個內(nèi)存屏障,對內(nèi)存操作順序進(jìn)行了限制。

16、synchronized 原理

synchronized 通過對象的對象頭(markword)來實現(xiàn)鎖機制,java 每個對象都有對象頭,都可以為 synchronized 實現(xiàn)提供基礎(chǔ),都可以作為鎖對象,在字節(jié)碼層面 synchronized 塊是通過插入?monitorenter?monitorexit完成同步的。持有 monitor 對象,通過進(jìn)入、退出這個 Monitor 對象來實現(xiàn)鎖機制。

17、談?wù)?NIO 的理解

NIO( New Input/ Output) 引入了一種基于通道和緩沖區(qū)的 I/O 方式,它可以使用 Native 函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在 Java 堆的DirectByteBuffer?對象作為這塊內(nèi)存的引用進(jìn)行操作,避免了在 Java 堆和Native 堆中來回復(fù)制數(shù)據(jù)。 NIO 是一種同步非阻塞的 IO 模型。同步是指線程不斷輪詢 IO 事件是否就緒,非阻塞是指線程在等待 IO 的時候,可以同時做其他任務(wù)。同步的核心就是 Selector,Selector 代替了線程本身輪詢 IO 事件,避免了阻塞同時減少了不必要的線程消耗;非阻塞的核心就是通道和緩沖區(qū),當(dāng) IO 事件就緒時,可以通過寫道緩沖區(qū),保證 IO 的成功,而無需線程阻塞式地等待。

  • synchronized 和 volatile 關(guān)鍵字的區(qū)別

  • synchronized 與 Lock 的區(qū)別

  • ReentrantLock 、synchronized 和 volatile 比較

1)volatile:?解決變量在多個線程間的可見性,但不能保證原子性,只能用于修飾變量,不會發(fā)生阻塞。volatile 能屏蔽編譯指令重排,不會把其后面的指令排到內(nèi)存屏障之前的位置,也不會把前面的指令排到內(nèi)存屏障的后面。多用于并行計算的單例模式。volatile 規(guī)定 CPU 每次都必須從內(nèi)存讀取數(shù)據(jù),不能從 CPU緩存中讀取,保證了多線程在多 CPU 計算中永遠(yuǎn)拿到的都是最新的值。

2)synchronized:?互斥鎖,操作互斥,并發(fā)線程過來,串行獲得鎖,串行執(zhí)行代碼。解決的是多個線程間訪問共享資源的同步性,可保證原子性,也可間接保證可見性,因為它會將私有內(nèi)存和公有內(nèi)存中的數(shù)據(jù)做同步??捎脕硇揎椃椒?、代碼塊。會出現(xiàn)阻塞。synchronized 發(fā)生異常時,會自動釋放線程占有的鎖,因此不會導(dǎo)致死鎖現(xiàn)象發(fā)生。非公平鎖,每次都是相互爭搶資源。

3)?lock 是一個接口,而 synchronized 是 java 中的關(guān)鍵字,synchronized 是內(nèi)置語言的實現(xiàn)。lock 可以讓等待鎖的線程響應(yīng)中斷。在發(fā)生異常時,如果沒有主動通過 unLock()去釋放鎖,則可能造成死鎖現(xiàn)象,因此使用 Lock 時需要在finally 塊中釋放鎖

4)?ReentrantLock?可重入鎖,鎖的分配機制是基于線程的分配,而不是基于方法調(diào)用的分配。ReentrantLock?有?tryLock?方法,如果鎖被其他線程持有,返回 false,可避免形成死鎖。對代碼加鎖的顆粒會更小,更節(jié)省資源,提高代碼性能。ReentrantLock?可實現(xiàn)公平鎖和非公平鎖,公平鎖就是先來的先獲取資源。ReentrantReadWriteLock?用于讀多寫少的場合,且讀不需要互斥場景。

  • ReentrantLock 的內(nèi)部實現(xiàn)

  • lock 原理

  • 死鎖的四個必要條件?

  • 怎么避免死鎖?

  • 對象鎖和類鎖是否會互相影響?

  • 什么是線程池,如何使用?

  • Java 的并發(fā)、多線程、線程模型

  • 談?wù)剬Χ嗑€程的理解

  • 多線程有什么要注意的問題?

  • 談?wù)勀銓Σl(fā)編程的理解并舉例說明

  • 談?wù)勀銓Χ嗑€程同步機制的理解?

  • 如何保證多線程讀寫文件的安全?

  • 多線程斷點續(xù)傳原理

  • 斷點續(xù)傳的實現(xiàn)

  • 并發(fā)編程有關(guān)知識點(這個是一般 Android 開發(fā)用的少的,所以建議多
    去看看):
    平時 Android 開發(fā)中對并發(fā)編程可以做得比較少,Thread 這個類經(jīng)常會用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應(yīng)該去了解一下 java的關(guān)于線程相關(guān)的源碼級別的東西。


查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)


原來在58.新浪對于線程.多線程.線程池的問答的評論 (共 條)

分享到微博請遵守國家法律
绥芬河市| 治县。| 儋州市| 巩义市| 福鼎市| 安国市| 宁波市| 石河子市| 牙克石市| 当涂县| 延长县| 和平县| 乌海市| 东兴市| 浮梁县| 甘谷县| 长海县| 怀远县| 泸定县| 梁河县| 张掖市| 吉木乃县| 昌江| 陇西县| 永登县| 盐池县| 拉萨市| 三穗县| 大竹县| 年辖:市辖区| 彭阳县| 河西区| 拉孜县| 天全县| 江北区| 清徐县| 区。| 罗平县| 灵川县| 河源市| 新宁县|