java并發(fā)編程實(shí)例分析
java并發(fā)編程是java程序設(shè)計(jì)語(yǔ)言的一塊重點(diǎn),在大部分的業(yè)務(wù)場(chǎng)景中都需要并發(fā)編程。
比如:并發(fā)的去處理http請(qǐng)求,這樣就可以使得一臺(tái)機(jī)器同時(shí)處理多個(gè)請(qǐng)求,大大提高業(yè)務(wù)的響應(yīng)效率,從而使用用戶體驗(yàn)更加流暢。
java如何并發(fā)編程,要注意以下幾個(gè)方面:
1、java語(yǔ)言中的多線程操作:創(chuàng)建和啟動(dòng)線程的幾種方式。
2、共享變量的同步問題,要保證線程安全,辨別哪些變量是線程安全的、那些變量是線程不安全的,對(duì)于不安全的變量我們要想辦法讓其同步,一般也就是加鎖。
3、線程鎖:包括方法鎖和synchronized塊的使用。
接下來(lái)就詳細(xì)說(shuō)一下這幾個(gè)方面。
首先說(shuō)創(chuàng)建線程的方式:一般有兩種方式
定義一個(gè)線程類:實(shí)現(xiàn)Runnable接口、或者繼承Thread,推薦是實(shí)現(xiàn)接口的方式。


啟動(dòng)線程的方式:
第一種:new Thread()的方式。
創(chuàng)建好的線程,然后通過new的方式啟動(dòng)線程,因?yàn)閯?chuàng)建方式的不同,他們啟動(dòng)的方式也略微有些差別。
第二種:通過線程池的方式啟動(dòng)線程。JavaAPI提供了線程池技術(shù),可以用池的原理,
去管理線程,池的技術(shù)在java中很常見,比如數(shù)據(jù)庫(kù)連接池等。
具體細(xì)節(jié)可以參考如下的連接:

共享變量的問題:要明白什么變量最有可能出現(xiàn)線程安全問題。沒錯(cuò)就是靜態(tài)變量,靜態(tài)變量
相當(dāng)于C語(yǔ)言的全局變量,如果是public類型,誰(shuí)都可以修改,所以這個(gè)時(shí)候就會(huì)出現(xiàn)
變量的線程安全問題。當(dāng)然了私有變量也可能出現(xiàn)線程安全問題。
具體細(xì)節(jié)可以參考如下的連接:

主要來(lái)說(shuō)一下線程鎖的兩種方式:
(1)首先定義一個(gè)MyBusiness類,此類中頂一個(gè)一個(gè)靜態(tài)變量i,和一個(gè)靜態(tài)方法,靜態(tài)方法的功能是讓i加1。

(2)然后定義一個(gè)線程類MyThread2,run方法中先讓線程sleep 2毫秒,然后執(zhí)行加1操作。

(3)定義測(cè)試類,測(cè)試類創(chuàng)建6000個(gè)MyThread2線程,然后sleep 1秒鐘,執(zhí)行輸出,顯示i的值。

(4)結(jié)果:從結(jié)果可以看出,此時(shí)出現(xiàn)了線程安全問題,就是說(shuō)某些線程在加1操作時(shí)取到了臟數(shù)據(jù),即
在某一個(gè)時(shí)間點(diǎn),多個(gè)線程同時(shí)取到了某個(gè)相同的i值,然后去修改,結(jié)果導(dǎo)致在這幾個(gè)線程中,只有最后一個(gè)
修改生效,而其他的則被覆蓋掉了。

(5)解決方案一:方法鎖,給add方法加鎖,表示同一時(shí)間只能有一個(gè)方法的調(diào)用被允許運(yùn)行,其他的線程等待鎖的釋放。
再次運(yùn)行,發(fā)現(xiàn)變成了6000就是正確的了。


(6)解決方案二:synchronized代碼塊,我們重新定義一個(gè)方法add1,然后用synchronized代碼塊鎖上MyBusiness類,
表示同一時(shí)間只能有一個(gè)線程操作MyBusiness類,其他線程必須等待鎖的釋放。


(7)查看結(jié)果,也得到了正確的輸出。

相關(guān)文章
詳解IntelliJ IDEA2020.1和JDK14體驗(yàn)
這篇文章主要介紹了詳解IntelliJ IDEA2020.1和JDK14體驗(yàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
SpringBoot實(shí)現(xiàn)熱部署的方式總結(jié)
所謂熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用,對(duì)于Java來(lái)說(shuō),熱部署就是在運(yùn)行時(shí)更新Java類文件,本文將深入探討SpringBoot有哪些方式可以實(shí)現(xiàn)熱部署,感興趣的朋友可以小編一探討學(xué)習(xí)2023-06-06
java的SimpleDateFormat線程不安全的幾種解決方案
但我們知道SimpleDateFormat是線程不安全的,處理時(shí)要特別小心,要加鎖或者不能定義為static,要在方法內(nèi)new出對(duì)象,再進(jìn)行格式化,本文就介紹了幾種方法,感興趣的可以了解一下2021-08-08
自定義注解實(shí)現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)
本文介紹了如何通過自定義注解@MyService和@MyServiceScans在SpringBoot項(xiàng)目中自動(dòng)將指定包下的類注入Spring容器,詳細(xì)解釋了創(chuàng)建自定義注解、定義包掃描器ClassPathBeanDefinitionScanner的作用與實(shí)現(xiàn)2024-09-09
SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManag
這篇文章主要介紹了SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManager的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程
學(xué)生信息管理系統(tǒng)是針對(duì)學(xué)校人事處的大量業(yè)務(wù)處理工作而開發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程,需要的朋友可以參考下2023-05-05
Java阻塞隊(duì)列BlockingQueue基礎(chǔ)與使用
本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場(chǎng)景,通過實(shí)例代碼介紹了Java 阻塞隊(duì)列BlockingQueue的相關(guān)知識(shí),需要的朋友可以參考下2023-01-01

