原创 java中常見的死鎖以及解決方法

在java中我們常常使用加鎖機制來確保線程安全,但是如果過度使用加鎖,則可能導致鎖順序死鎖。同樣,我們使用線程池和信號量來限制對資源的使用,但是這些被限制的行爲可能會導致資源死鎖。java應用程序無法從死鎖中恢復過來,因此設計時一定要

原创 線程飢餓死鎖

1.飢餓死鎖介紹 在線程池中,如果任務依賴於其他任務,那麼可能產生死鎖。在單線程Executor中,如果一個任務將另一個任務提交到同一個Executor,並且等待這個被提交任務的結果,那麼通常會發生死鎖。第二個任務停留在工作隊列中,並

原创 自定義一個Thread基類

場景:在應用程序中我們需要自己定義一個特殊的線程來調試,以區分其他的線程。比如說:爲線程指定名字,設置自定義的UncaugthExceptionHandler向Logger中寫入信息,維護一些統計信息(包括有多少線程被創建和銷燬),以

原创 如何正確的終止線程

大多時候線程是運行直到結束或者讓他們自己停止。然而有時候我們希望提前結束任務或線程,或許是因爲用戶取消的操作,或者應用程序需要被快速關閉。 java中沒有提供任何機制來安全地終止線程。但它提供了中斷,這是一種協作機制,能夠使一個線程終

原创 shutdownNow的侷限性以及解決辦法

侷限性:showdownNow會嘗試取消正在執行的任務並返回所有已經提交但尚未開始執行的任務。也就是說我們不能瞭解到哪些任務已經開始但是尚未結束。 解決辦法如下: 思路:判斷任務在返回時是否處於中斷狀態。 代碼: public cla

原创 java實現旅行預訂門戶搜索報價方案

**問題:**需要做這樣一個旅行預訂門戶網站-----用戶輸入旅行的日期和其他需求,門戶網站獲取並顯示來自多條航線,旅店或汽車租賃公司的報價。 **分析:**在獲取不同公司報價的過程中,可能會調用web服務,訪問數據庫,執行一個EDI

原创 如何高效實現一個頁面渲染器

一 java線程池的基礎知識(磨刀不誤砍柴工) 1.newFixedThreadPool。newFixedThreadPool將創建一個固定長度的線程池,每當提交一個任務時創建一個線程,直到達到線程池的最大數量,這時線程池的規模將不

原创 java併發實戰第一部分小結

java併發編程實戰第一部分總結筆記 1.可變狀態是至關重要的 所有的併發問題都可以歸結爲如何協調對併發狀態的訪問。可變狀態越少,就越容易確保線程安全性。 2.儘量將域聲明爲final類型,除非需要他們是可變的。 3.不可變對象一定是

原创 學習如何構建一個高效且可伸縮的緩存

我們平時處理高併發的請求處理時,服務器的壓力會很大。我們常做的就是構建一個高效的可伸縮的緩存來減輕服務器的壓力。 1.第一次嘗試 分析:使用 HashMap充當cache。 public interface Computable<A,

原创 柵欄

1.柵欄與閉鎖的區分 相同點:柵欄類似與閉鎖,都能阻塞一組線程直到某個事件的發生。 不同點:閉鎖是一次性對象,一旦終止就不能被重置,一般用於等待事件。 柵欄是所有的線程必須都到達柵欄的位置,才能繼續執行,一般用於等待其他線程,以及實現

原创 http和https的區別

1.首先來了解一下對稱加密算法和非對稱加密算法 1.1 對稱加密算法 -共享密鑰加密 對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),

原创 信號量

計數信號量用來控制同時訪問某個特定資源的操作數量或者同時執行某個指定操作的數量。可以用來實現某種資源池(數據庫連接池)或對容器施加邊界。 例如:使用Semaphore來爲容器設置邊界 思路:將Semaphore的計數值爲池的大小,並從

原创 簡單分析TCP3次握手4次揮手

1.TCP頭部結構 TCP標誌位有6種標識 SYN(synchronous建立聯機) ACK(acknowledgement確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊

原创 java中的閉鎖

閉鎖是一種同步工具類,可以延遲線程的進度直到其到達終點狀態。 (一)常用的場景如下: 1)確保某個計算在其需要的所有資源都被初始化之後才繼續執行。二元閉鎖(包括兩個狀態)可以用來表示"資源R已經被初始化",而所有需要R的操作都必須先在

原创 java多線程相關知識點

1.sleep和wait的區別 (1).sleep是Thread中的靜態方法,誰調用誰去睡覺,即使在T1線程裏調用了T2線程的sleep方法, 實際上還是T1去睡覺。 (2)sleep方法不會釋放對象得鎖,而wait方法釋放了鎖.