java多線程實例項目 多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?下面簡要解釋一下原因:鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。我這個操作需要看上面的第二個圖,你能很清
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
下面簡要解釋一下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內存和本地內存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關鍵字后,它將在操作后強制工作內存和主內存同步,以確保其他線程可以立即看到它。
java多線程在互聯(lián)網(wǎng)公司的應用場景是什么?
Java語言的一個重要特性是它支持多線程。多線程技術是Java的一種先進技術,它涉及到操作系統(tǒng)的知識,接近于系統(tǒng)級。對于普通程序員來說,他們很少碰它。目前,在javaee(原始J2EE)的相關框架中,盡量避免使用線程。程序員最理想的狀態(tài)是專注于業(yè)務邏輯,而不是每天思考如何編寫線程。最典型的應用程序,如tomcat、tomcat,是多線程的,數(shù)百個客戶機訪問同一個web應用程序。在Tomcat訪問之后,隨后的處理被拋出到一個新線程。新線程最終被調用到我們的servlet程序,比如doGet或doPost。
如果我們不使用多線程機制,當數(shù)百人同時訪問一個web應用程序時,Tomcat將不得不排隊等待串行處理,因此客戶端根本無法忍受這種訪問速度。
還需要異步處理,您需要使用多線程。例如,任務a和任務B需要并行處理,單個線程只能串行處理。首先完成任務a,然后執(zhí)行任務B,如果要同時執(zhí)行多個任務,必須為每個任務分配一個線程,然后通過Java虛擬機的線程調度,同時執(zhí)行多個任務。例如,如果您的CPU是多核的,那么您可以讓CPU執(zhí)行一個線程。如果只有一個CPU,底層基于分時復用的原則,每個線程根據(jù)時間片獲得CPU資源。