真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java多線程的三大特性,線程池,JMM(Java共享內(nèi)存)-創(chuàng)新互聯(lián)

一,線程的三大特性:原子性、可見性、有序性
  1)原子性,即一個操作或者多個操作要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷,要么就都不執(zhí)行。原子性其實就是保證數(shù)據(jù)一致、線程安全一部分。
  2)可見性,即當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看得到修改的值。
  3)有序性,即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。
二、JAVA多線程的內(nèi)存模型
  共享內(nèi)存模型指的就是Java內(nèi)存模型(簡稱JMM),JMM決定一個線程對共享變量的寫入時,能對另一個線程可見。從抽象的角度來看,JMM定義了線程和主內(nèi)存之間的抽象關(guān)系:線程之間的共享變量存儲在主內(nèi)存(main memory)中,每個線程都有一個私有的本地內(nèi)存(local memory),本地內(nèi)存中存儲了該線程以讀/寫共享變量的副本。本地內(nèi)存是JMM的一個抽象概念,并不真實存在。它涵蓋了緩存,寫緩沖區(qū),寄存器以及其他的硬件和編譯器優(yōu)化。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供北海網(wǎng)站建設(shè)、北海做網(wǎng)站、北海網(wǎng)站設(shè)計、北海網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、北海企業(yè)網(wǎng)站模板建站服務(wù),10多年北海做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

從上圖來看,線程A與線程B之間如要通信的話,必須要經(jīng)歷下面2個步驟:
  1. 首先,線程A把本地內(nèi)存A中更新過的共享變量刷新到主內(nèi)存中去。
  2. 然后,線程B到主內(nèi)存中去讀取線程A之前已更新過的共享變量。

 總結(jié):什么是Java內(nèi)存模型:java內(nèi)存模型簡稱jmm,定義了一個線程對另一個線程可見。共享變量存放在主內(nèi)存中,每個線程都有自己的本地內(nèi)存,當多個線程同時訪問一個數(shù)據(jù)的時候,可能本地內(nèi)存沒有及時刷新到主內(nèi)存,所以就會發(fā)生線程安全問題。
三、Volatile
  Volatile 關(guān)鍵字的作用是變量在多個線程之間可見。
  1)由于線程之間是不可見的,讀取的是副本,所以會沒有及時讀取到主內(nèi)存結(jié)果。解決辦法使用Volatile關(guān)鍵字將解決線程之間可見性, 強制線程每次讀取該值的時候都去“主內(nèi)存”中取值
  2)Volatile非原子性
    由于Volatile不具有原子性,需要Atomic原子類。
    AtomicInteger atomicInteger = new AtomicInteger(0);
  3)volatile與synchronized區(qū)別
    僅靠volatile不能保證線程的安全性。(非原子性)
    a、volatile輕量級,只能修飾變量。synchronized重量級,還可修飾方法
    b、volatile只能保證數(shù)據(jù)的可見性,不能用來同步,因為多個線程并發(fā)訪問volatile修飾的變量不會阻塞。
    c、synchronized不僅保證可見性,而且還保證原子性,因為,只有獲得了鎖的線程才能進入臨界區(qū),從而保證臨界區(qū)中的所有語句都全部執(zhí)行。多個線程爭搶synchronized鎖對象時,會出現(xiàn)阻塞。
    d、線程安全性
    線程安全性包括兩個方面,①可見性。②原子性。
    從上面自增的例子中可以看出:僅僅使用volatile并不能保證線程安全性。而synchronized則可實現(xiàn)線程的安全性。
四、ThreadLocal
  1)ThreadLocal提高一個線程的局部變量,訪問某個線程擁有自己局部變量。當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應(yīng)的副本。
  2)ThreadLocal類的接口方法
    ThreadLocal類接口很簡單,只有4個方法,我們先來了解一下:
    a、void set(Object value)設(shè)置當前線程的線程局部變量的值。
    b、public Object get()該方法返回當前線程所對應(yīng)的線程局部變量。
    c、public void remove()將當前線程局部變量的值刪除,目的是為了減少內(nèi)存的占用。需要指出的是,當線程結(jié)束后,對應(yīng)該線程的局部變量將自動被垃圾回收,所以顯式調(diào)用該方法清除線程的局部變量并不是必須的操作,但它可以加快內(nèi)存回收的速度。
    d、protected Object initialValue()返回該線程局部變量的初始值,該方法是一個protected的方法,顯然是為了讓子類覆蓋而設(shè)計的。這個方法是一個延遲調(diào)用方法,在線程第1次調(diào)用get()或set(Object)時才執(zhí)行,并且僅執(zhí)行1次。ThreadLocal中的缺省實現(xiàn)直接返回一個null。
public static ThreadLocal threadLocal = new ThreadLocal() {
protected Integer initialValue() {
return 0;
};
};
  3)ThreadLoca實現(xiàn)原理
    ThreadLoca通過map集合
    Map.put(“當前線程”,值);
五、線程池
  1)什么是線程池
    線程池是指在初始化一個多線程應(yīng)用程序過程中創(chuàng)建一個線程集合,然后在需要執(zhí)行新的任務(wù)時重用這些線程而不是新建一個線程。線程池中線程的數(shù)量通常完全取決于可用內(nèi)存數(shù)量和應(yīng)用程序的需求。然而,增加可用線程數(shù)量是可能的。線程池中的每個線程都有被分配一個任務(wù),一旦任務(wù)已經(jīng)完成了,線程回到池子中并等待下一次分配任務(wù)。
  2)線程池的作用
  基于以下幾個原因在多線程應(yīng)用程序中使用線程是必須的:
    1. 線程池改進了一個應(yīng)用程序的響應(yīng)時間。由于線程池中的線程已經(jīng)準備好且等待被分配任務(wù),應(yīng)用程序可以直接拿來使用而不用新建一個線程。
    2. 線程池節(jié)省了CLR 為每個短生存周期任務(wù)創(chuàng)建一個完整的線程的開銷并可以在任務(wù)完成后回收資源。
    3. 線程池根據(jù)當前在系統(tǒng)中運行的進程來優(yōu)化線程時間片。
    4. 線程池允許我們開啟多個任務(wù)而不用為每個線程設(shè)置屬性。
    5. 線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個包含狀態(tài)信息的對象引用。
    6. 線程池可以用來解決處理一個特定請求大線程數(shù)量限制問題。
  3)線程池的4種創(chuàng)建方式
  Java通過Executors(jdk1.5并發(fā)包)提供四種線程池,分別為:
  1.newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。(常用)
  2.newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程大并發(fā)數(shù),超出的線程會在隊列中等待。
  3.newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。
  4.newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。


文章標題:Java多線程的三大特性,線程池,JMM(Java共享內(nèi)存)-創(chuàng)新互聯(lián)
當前URL:http://weahome.cn/article/dedigo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部