1.synchronized 和 reentrantlock 異同
相同點
都實現(xiàn)了多線程同步和內(nèi)存可見性語義,都是可重入鎖
不同點
實現(xiàn)機(jī)制不同 synchronized 通過 java 對象頭鎖標(biāo)記和 Monitor 對象實現(xiàn) reentrantlock 通過CAS、ASQ(AbstractQueuedSynchronizer)和 locksupport(用于阻塞和解除阻塞)實現(xiàn)synchronized 依賴 jvm 內(nèi)存模型保證包含共享變量的多線程內(nèi)存可見性 reentrantlock 通過 ASQ 的volatile state 保證包含共享變量的多線程內(nèi)存可見性
使用方式不同 synchronized 可以修飾實例方法(鎖住實例對象)、靜態(tài)方法(鎖住類對象)、代碼塊(顯示指定鎖對象)reentrantlock 顯示調(diào)用 trylock()/lock() 方法,需要在 finally 塊中釋放鎖功能豐富程度不同 reentrantlock
提供有限時間等候鎖(設(shè)置過期時間)、可中斷鎖(lockInterruptibly)、condition(提供 await、signal等方法)等豐富語義 reentrantlock 提供公平鎖和非公平鎖實現(xiàn) synchronized不可設(shè)置等待時間、不可被中斷(interrupted)
2. concurrenthashmap 為何讀不用加鎖
jdk1.7
1)HashEntry 中的 key、hash、next 均為 final 型,只能表頭插入、刪除結(jié)點
2)HashEntry 類的 value 域被聲明為 volatile 型
3)不允許用 null 作為鍵和值,當(dāng)讀線程讀到某個 HashEntry 的 value 域的值為 null時,便知道產(chǎn)生了沖突——發(fā)生了重排序現(xiàn)象(put 設(shè)置新 value 對象的字節(jié)碼指令重排序),需要加鎖后重新讀入這個 value 值
4)volatile 變量 count 協(xié)調(diào)讀寫線程之間的內(nèi)存可見性,寫操作后修改 count,讀操作先讀 count,根據(jù)happen-before 傳遞性原則寫操作的修改讀操作能夠看到
jdk1.8
1)Node 的 val 和 next 均為 volatile 型
2)tabAt 和 casTabAt 對應(yīng)的 unsafe 操作實現(xiàn)了 volatile 語義
3. ContextClassLoader(線程上下文類加載器)的作用
越過類加載器的雙親委派機(jī)制去加載類,如 serviceloader 實現(xiàn)使用線程上下文類加載器加載類,要注意保證多個需要通信的線程間的類加載器應(yīng)該是同一個,防止因為不同的類加載器導(dǎo)致類型轉(zhuǎn)換異常(ClassCastException)
4. tomcat 類加載機(jī)制
不同應(yīng)用使用不同的 webapp 類加載器,實現(xiàn)應(yīng)用隔離的效果,webapp 類加載器下面是jsp類加載器;不同應(yīng)用共享的 jar 包可以放到 Shared 類加載器 /shared 目錄下
5. osgi 類加載機(jī)制
osgi 類加載模型是網(wǎng)狀的,可以在模塊(Bundle)間互相委托
osgi 實現(xiàn)模塊化熱部署的關(guān)鍵是自定義類加載器機(jī)制的實現(xiàn),每個 Bundle 都有一個自己的類加載器,當(dāng)需要更換一個 Bundle時,就把 Bundle 連同類加載器一起換掉以實現(xiàn)代碼的熱替換
當(dāng)收到類加載請求時,osgi 將按照下面的順序進(jìn)行類搜索:
1)將以 java.* 開頭的類委派給父類加載器加載
2)否則,將委派列表名單(配置文件 org.osgi.framework.bootdelegation 中定義)內(nèi)的類委派給父類加載器加載
3)否則,檢查是否在 Import-Package 中聲明,如果是,則委派給 Export 這個類的 Bundle 的類加載器加載
4)否則,檢查是否在 Require-Bundle 中聲明,如果是,則將類加載請求委托給 required bundle 的類加載器
5)否則,查找當(dāng)前 Bundle 的 ClassPath,使用自己的類加載器加載
6)否則,查找類是否在自己的 Fragment Bundle 中,如果在,則委派給 Fragment Bundle 的類加載器加載
7)否則,查找 Dynamic Import-Package(Dynamic Import 只有在真正用到此 Package的時候才進(jìn)行加載)的 Bundle,委派給對應(yīng) Bundle 的類加載器加載
8)否則,類查找失敗
6. 如何結(jié)束一個一直運行的線程
使用退出標(biāo)志,這個 flag 變量要多線程可見
使用 interrupt,結(jié)合 isInterrupted() 使用
7. threadlocal 使用場景及問題
threadlocal 并不能解決多線程共享變量的問題,同一個 threadlocal 所包含的對象,在不同的 thread中有不同的副本,互不干擾
用于存放線程上下文變量,方便同一線程對變量的前后多次讀取,如事務(wù)、數(shù)據(jù)庫 connection 連接,在 web 編程中使用的更多
問題: 注意線程池場景使用 threadlocal,因為實際變量值存放在了 thread 的 threadlocalmap類型變量中,如果該值沒有 remove,也沒有先 set 的話,可能會得到以前的舊值
問題: 注意線程池場景下的內(nèi)存泄露,雖然 threadlocal 的 get/set 會清除 key(key 為 threadlocal的弱引用,value 是強(qiáng)引用,導(dǎo)致 value 不釋放)為 null 的 entry,但是最好 remove
8. 線程池從啟動到工作的流程
剛創(chuàng)建時,里面沒有線程調(diào)用 execute() 添加任務(wù)時:
1)如果正在運行的線程數(shù)量小于核心參數(shù) corePoolSize,繼續(xù)創(chuàng)建線程運行這個任務(wù)
2)否則,如果正在運行的線程數(shù)量大于或等于 corePoolSize,將任務(wù)加入到阻塞隊列中
3)否則,如果隊列已滿,同時正在運行的線程數(shù)量小于核心參數(shù) maximumPoolSize,繼續(xù)創(chuàng)建線程運行這個任務(wù)
4)否則,如果隊列已滿,同時正在運行的線程數(shù)量大于或等于 maximumPoolSize,根據(jù)設(shè)置的拒絕策略處理
5)完成一個任務(wù),繼續(xù)取下一個任務(wù)處理
6)沒有任務(wù)繼續(xù)處理,線程被中斷或者線程池被關(guān)閉時,線程退出執(zhí)行,如果線程池被關(guān)閉,線程結(jié)束
7)否則,判斷線程池正在運行的線程數(shù)量是否大于核心線程數(shù),如果是,線程結(jié)束,否則線程阻塞。因此線程池任務(wù)全部執(zhí)行完成后,繼續(xù)留存的線程池大小為corePoolSize
9. 阻塞隊列 BlockingQueue take 和 poll 區(qū)別
poll(time):取走 BlockingQueue 里排在首位的對象, 若不能立即取出,則可以等 time參數(shù)規(guī)定的時間,取不到時返回 null
take():取走 BlockingQueue 里排在首位的對象,若 BlockingQueue 為空,阻塞直到BlockingQueue 有新的對象被加入
10. 如何從 FutureTask 不阻塞獲取結(jié)果
get(long timeout,TimeUnit unit),超時則返回
輪詢,先通過 isDone()判斷是否結(jié)束,然后調(diào)用 get()
11. blockingqueue 如果存放了比較關(guān)鍵的數(shù)據(jù),系統(tǒng)宕機(jī)該如何處理
將隊列持久化,比較麻煩,需要將生產(chǎn)數(shù)據(jù)持久化到磁盤,持久化成功才返回,消費者線程從磁盤加載數(shù)據(jù)到內(nèi)存阻塞隊列中,維護(hù)消費offset,啟動時,根據(jù)消費 offset 從磁盤加載數(shù)據(jù)加入消息隊列,保證消息不丟失,生成序列號,消費冪等,根據(jù)消費進(jìn)程決定系統(tǒng)重啟后的生產(chǎn)狀態(tài)
12. NIO 與傳統(tǒng) I/O 的區(qū)別
節(jié)約線程,NIO 由原來的每個線程都需要阻塞讀寫變成了由單線程(即 Selector)負(fù)責(zé)處理多個 channel注冊(register)的興趣事件(SelectionKey)集合(底層借助操作系統(tǒng)提供的 epoll()),netty bossgroup 處理 accept 連接,workergroup 處理具體業(yè)務(wù)流程和數(shù)據(jù)讀寫NIO 提供非阻塞操作傳統(tǒng) I/O 以流的方式處理數(shù)據(jù),而 NIO 以塊的方式處理數(shù)據(jù),NIO 提供 bytebuffer,分為堆內(nèi)和堆外緩沖區(qū),讀寫時均先放到該緩沖區(qū)中,然后由內(nèi)核通過 channel傳輸?shù)綄Χ?,堆外緩沖區(qū)不走內(nèi)核,提升了性能
13. list 中存放可重復(fù)字符串,如何刪除某個字符串
調(diào)用 iterator 相關(guān)方法刪除倒刪,防止正序刪除導(dǎo)致的數(shù)組重排,index 跳過數(shù)組元素問題
14. 有哪些 GC ROOTS(跟日常開發(fā)比較相關(guān)的是和此相關(guān)的內(nèi)存泄露)
所有 Java 線程當(dāng)前活躍的棧幀里指向 GC 堆里的對象的引用,因此用不到的對象及時置 null,提升內(nèi)存回收效率
靜態(tài)變量引用的對象,因此減少靜態(tài)變量特別是靜態(tài)集合變量的大小,集合存放的對象覆寫 euqls()和 hashcode(),防止持續(xù)增長
本地方法 JNI 引用的對象
方法區(qū)中的常量引用的對象,因此減少在長字符串上調(diào)用 String.intern()
classloader 加載的 class 對象,因此自定義 classloader 無效時及時置 null并且注意類加載器加載對象之間的隔離jvm 里的一些靜態(tài)數(shù)據(jù)結(jié)構(gòu)里指向 GC 堆里的對象的引用?
Atas ialah kandungan terperinci 常見的14個互聯(lián)網(wǎng)Java面試題. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

HTTP Log Middleware di GO boleh merakam kaedah permintaan, laluan, IP klien dan memakan masa. 1. Gunakan http.handlerfunc untuk membungkus pemproses, 2. Rekod waktu mula dan masa akhir sebelum dan selepas memanggil next.servehttp, 3. Dapatkan IP pelanggan sebenar melalui r.remoteaddr dan X-forward-for headers, 4. Gunakan log.printf untuk mengeluarkan log permintaan, 5. Kod sampel lengkap telah disahkan untuk dijalankan dan sesuai untuk memulakan projek kecil dan sederhana. Cadangan lanjutan termasuk menangkap kod status, menyokong log JSON dan meminta penjejakan ID.

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.
