java并發(fā)編程實(shí)例分析
java并發(fā)編程是java程序設(shè)計語言的一塊重點(diǎn),在大部分的業(yè)務(wù)場景中都需要并發(fā)編程。
比如:并發(fā)的去處理http請求,這樣就可以使得一臺機(jī)器同時處理多個請求,大大提高業(yè)務(wù)的響應(yīng)效率,從而使用用戶體驗(yàn)更加流暢。
java如何并發(fā)編程,要注意以下幾個方面:
1、java語言中的多線程操作:創(chuàng)建和啟動線程的幾種方式。
2、共享變量的同步問題,要保證線程安全,辨別哪些變量是線程安全的、那些變量是線程不安全的,對于不安全的變量我們要想辦法讓其同步,一般也就是加鎖。
3、線程鎖:包括方法鎖和synchronized塊的使用。
接下來就詳細(xì)說一下這幾個方面。
首先說創(chuàng)建線程的方式:一般有兩種方式
定義一個線程類:實(shí)現(xiàn)Runnable接口、或者繼承Thread,推薦是實(shí)現(xiàn)接口的方式。
啟動線程的方式:
第一種:new Thread()的方式。
創(chuàng)建好的線程,然后通過new的方式啟動線程,因?yàn)閯?chuàng)建方式的不同,他們啟動的方式也略微有些差別。
第二種:通過線程池的方式啟動線程。JavaAPI提供了線程池技術(shù),可以用池的原理,
去管理線程,池的技術(shù)在java中很常見,比如數(shù)據(jù)庫連接池等。
具體細(xì)節(jié)可以參考如下的連接:
共享變量的問題:要明白什么變量最有可能出現(xiàn)線程安全問題。沒錯就是靜態(tài)變量,靜態(tài)變量
相當(dāng)于C語言的全局變量,如果是public類型,誰都可以修改,所以這個時候就會出現(xiàn)
變量的線程安全問題。當(dāng)然了私有變量也可能出現(xiàn)線程安全問題。
具體細(xì)節(jié)可以參考如下的連接:
主要來說一下線程鎖的兩種方式:
(1)首先定義一個MyBusiness類,此類中頂一個一個靜態(tài)變量i,和一個靜態(tài)方法,靜態(tài)方法的功能是讓i加1。
(2)然后定義一個線程類MyThread2,run方法中先讓線程sleep 2毫秒,然后執(zhí)行加1操作。
(3)定義測試類,測試類創(chuàng)建6000個MyThread2線程,然后sleep 1秒鐘,執(zhí)行輸出,顯示i的值。
(4)結(jié)果:從結(jié)果可以看出,此時出現(xiàn)了線程安全問題,就是說某些線程在加1操作時取到了臟數(shù)據(jù),即
在某一個時間點(diǎn),多個線程同時取到了某個相同的i值,然后去修改,結(jié)果導(dǎo)致在這幾個線程中,只有最后一個
修改生效,而其他的則被覆蓋掉了。
(5)解決方案一:方法鎖,給add方法加鎖,表示同一時間只能有一個方法的調(diào)用被允許運(yùn)行,其他的線程等待鎖的釋放。
再次運(yùn)行,發(fā)現(xiàn)變成了6000就是正確的了。
(6)解決方案二:synchronized代碼塊,我們重新定義一個方法add1,然后用synchronized代碼塊鎖上MyBusiness類,
表示同一時間只能有一個線程操作MyBusiness類,其他線程必須等待鎖的釋放。
(7)查看結(jié)果,也得到了正確的輸出。
相關(guān)文章
springboot使用logback文件查看錯誤日志過程詳解
這篇文章主要介紹了springboot使用logback文件查看錯誤日志過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09詳解MyBatis的動態(tài)SQL實(shí)現(xiàn)原理
MyBatis提供了強(qiáng)大的動態(tài)SQL語句生成功能,以應(yīng)對復(fù)雜的業(yè)務(wù)場景,本篇文章將結(jié)合MyBatis解析SQL語句的過程對MyBatis中對<if>,<where>,<foreach>等動態(tài)SQL標(biāo)簽的支持進(jìn)行分析,需要的朋友可以參考下2023-07-07Spring切面優(yōu)先級與基于xml的AOP實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Spring切面的優(yōu)先級與基于xml的AOP的詳細(xì)步驟,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11- 在剛開始學(xué)習(xí)Java的時候,就了解了Java基礎(chǔ)中的變量,雖然知道這個以后會經(jīng)常用到,但沒想到了基本語法這里,竟然又冒出來了成員變量和局部變量。變來變?nèi)ヌ菀鬃屓烁銜灹?,今天我們就挑揀出來梳理一下?/div> 2016-07-07
Java was started but returned exit code=13問題解決案例詳解
這篇文章主要介紹了Java was started but returned exit code=13問題解決案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09JavaWeb實(shí)現(xiàn)壓縮多個文件并下載實(shí)例詳解
本文通過實(shí)例代碼給大家講解了javaweb實(shí)現(xiàn)壓縮多個文件并下載功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-07-07最新評論