日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié)

瀏覽:128日期:2022-08-12 13:39:41
Java實(shí)現(xiàn)并發(fā)的幾種方法

Java程序默認(rèn)以單線程方式運(yùn)行。

synchronized

Java 用過synchronized 關(guān)鍵字來保證一次只有一個(gè)線程在執(zhí)行代碼塊。

public synchronized void code() { // TODO}Volatile

Volatile 關(guān)鍵字保證任何線程在讀取Volatile修飾的變量的時(shí)候,讀取的都是這個(gè)變量的最新數(shù)據(jù)。

Threads 和 Runnable

public class MyRunnable implements Runnable { @Override public void run() { // TODO }}

import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) {Runnable task = new MyRunnable();Thread worker = new Thread(task);worker.setName(’Myrunnable’);worker.start();}

創(chuàng)建thread會(huì)有很多overhead,性能低且不易管理

Thread pools

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main { private static final int NUMOFTHREDS = 5; public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(NUMOFTHREDS);for (int i = 0; i < 50; i++) { Runnable worker = new MyRunnable(i); executor.execute(worker);}// executor不接受新的threadsexecutor.shutdown();// 等待所有threads結(jié)束executor.awaitTermination();System.out.println('Finished all threads'); }}Futures 和 Callables

因?yàn)镽unnable對(duì)象無(wú)法向調(diào)用者返回結(jié)果,我們可以用Callable類來返回結(jié)果。

package de.vogella.concurrency.callables;import java.util.concurrent.Callable;public class MyCallable implements Callable<Long> { @Override public Long call() throws Exception { // TODO int sum = 1;return sum; }}

import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableFutures { private static final int NUMOFTHREDS = 5; public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(NUMOFTHREDS);List<Future<Long>> list = new ArrayList<Future<Long>>();for (int i = 0; i < 10; i++) { Callable<Long> worker = new MyCallable(); Future<Long> submit = executor.submit(worker); list.add(submit);}long sum = 0;for (Future<Long> future : list) { try {sum += future.get(); } catch (InterruptedException e) {e.printStackTrace(); } catch (ExecutionException e) {e.printStackTrace(); }}System.out.println(sum);executor.shutdown(); }}CompletableFuture

CompletableFuture 在Future的基礎(chǔ)上增加了異步調(diào)用的功能。callback()函數(shù)Thread執(zhí)行結(jié)束的時(shí)候會(huì)自動(dòng)調(diào)用。

CompletableFuture既支持阻塞,也支持非阻塞的callback()

import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class CompletableFutureSimpleSnippet { public static void main(String[] args) { CompletableFuture<Integer> data = createCompletableFuture().thenApply((Integer count) -> { int transformedValue = count * 10; return transformedValue;}); try { int count = futureCount.get(); } catch (InterruptedException | ExecutionException ex) { } } private static CompletableFuture<Integer> createCompletableFuture() {CompletableFuture<Integer> futureCount = CompletableFuture.supplyAsync(() -> { return 1;});return futureCount; }}

補(bǔ)充:Java如何處理高并發(fā)的情況

為了更好的理解并發(fā)和同步,需要先明白兩個(gè)重要的概念:同步和異步

所謂同步,可以理解為在執(zhí)行完一個(gè)函數(shù)或方法之后,一直等待系統(tǒng)返回值或消息,這時(shí)程序是出于阻塞的,只有接收到返回的值或消息后才往下執(zhí)行其它的命令。 同步就是一件事,一件事情一件事的做。

異步,執(zhí)行完函數(shù)或方法后,不必阻塞性地等待返回值或消息,只需要向系統(tǒng)委托一個(gè)異步過程,那么當(dāng)系統(tǒng)接收到返回值或消息時(shí),系統(tǒng)會(huì)自動(dòng)觸發(fā)委托的異步過程,從而完成一個(gè)完整的流程。異步就是,做一件事情,不影響做其他事情。

同步關(guān)鍵字synchronized,假如這個(gè)同步的監(jiān)視對(duì)象是類的話,那么如果當(dāng)一個(gè)對(duì)象 訪問類里面的同步方法的話,那么其它的對(duì)象如果想要繼續(xù)訪問類里面的這個(gè)同步方法的話,就會(huì)進(jìn)入阻塞,只有等前一個(gè)對(duì)象 執(zhí)行完該同步方法后當(dāng)前對(duì)象才能夠繼續(xù)執(zhí)行該方法。這就是同步。相反,如果方法前沒有同步關(guān)鍵字修飾的話,那么不同的對(duì)象可以在同一時(shí)間訪問同一個(gè)方法,這就是異步。

臟數(shù)據(jù):就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù)(Dirty Data),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。

1、什么是并發(fā)問題

多個(gè)進(jìn)程或線程同時(shí)(在同一段時(shí)間內(nèi))訪問同一資源會(huì)產(chǎn)生并發(fā)問題。

比如A、B操作員同時(shí)讀取一余額為1000元的賬戶,A操作員為該賬戶增加100元,B操作員同時(shí)為該賬戶減去 50元,A先提交,B后提交。 最后實(shí)際賬戶余額為1000-50=950元,但本該為 1000+100-50=1050。這就是典型的并發(fā)問題。如何解決?

處理并發(fā)和同同步問題主要是通過鎖機(jī)制。

2、如何處理并發(fā)和同步

一種是java中的同步鎖,典型的就是同步關(guān)鍵字synchronized。

另外一種比較典型的就是悲觀鎖和樂觀鎖。

在java中有兩種方式實(shí)現(xiàn)原子性操作(即同步操作):

1)使用同步關(guān)鍵字synchronized

2)使用lock鎖機(jī)制其中也包括相應(yīng)的讀寫鎖

悲觀鎖,正如其名,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自 外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度,因此,在整個(gè)數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。

樂觀鎖,大多是基于數(shù)據(jù)版本 Version )記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫(kù)表的版本解決方案中,一般是通過為數(shù)據(jù)庫(kù)表增加一個(gè) “version” 字段來 實(shí)現(xiàn)。 讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提 交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù) 版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過期數(shù)據(jù)。

樂觀鎖機(jī)制是在我們的系統(tǒng)中實(shí)現(xiàn),來自外部系統(tǒng)的用戶 余額更新操作不受我們系統(tǒng)的控制,因此可能會(huì)造成臟數(shù)據(jù)被更新到數(shù)據(jù)庫(kù)中。在 系統(tǒng)設(shè)計(jì)階段,我們應(yīng)該充分考慮到這些情況出現(xiàn)的可能性,并進(jìn)行相應(yīng)調(diào)整(如 將樂觀鎖策略在數(shù)據(jù)庫(kù)存儲(chǔ)過程中實(shí)現(xiàn),對(duì)外只開放基于此存儲(chǔ)過程的數(shù)據(jù)更新途 徑,而不是將數(shù)據(jù)庫(kù)表直接對(duì)外公開)。

【謹(jǐn)防在此,面試官會(huì)問到死鎖的相關(guān)問題!!!關(guān)于死鎖的問題,在其余某篇博客都有說明】

3、常見并發(fā)同步案例分析案例一、訂票系統(tǒng)案例

某航班只有一張機(jī)票,假定有1w個(gè)人打開你的網(wǎng)站來訂票,問你如何解決并發(fā)問題(可擴(kuò)展到任何高并發(fā)網(wǎng)站要考慮的并發(fā)讀寫問題)

假定我們采用了同步機(jī)制或者數(shù)據(jù)庫(kù)物理鎖機(jī)制,如何保證1w個(gè)人還能同時(shí)看到有票,顯然會(huì)犧牲性能,在高并發(fā)網(wǎng)站中是不可取的。

采用樂觀鎖即可解決此問題。樂觀鎖意思是不鎖定表的情況下,利用業(yè)務(wù)的控制來解決并發(fā)問題,這樣即保證數(shù)據(jù)的并發(fā)可讀性又保證保存數(shù)據(jù)的排他性,保證性能的同時(shí)解決了并發(fā)帶來的臟數(shù)據(jù)問題。

如何實(shí)現(xiàn)樂觀鎖:

前提:在現(xiàn)有表當(dāng)中增加一個(gè)冗余字段,version版本號(hào), long類型

原理:

1)只有當(dāng)前版本號(hào)>=數(shù)據(jù)庫(kù)表版本號(hào),才能提交

2)提交成功后,版本號(hào)version ++

案例二、股票交易系統(tǒng)、銀行系統(tǒng),大數(shù)據(jù)量你是如何考慮的

首先,股票交易系統(tǒng)的行情表,每幾秒鐘就有一個(gè)行情記錄產(chǎn)生,一天下來就有(假定行情3秒一個(gè)) 股票數(shù)量×20×60*6 條記錄,一月下來這個(gè)表記錄數(shù)量多大? 一張表的記錄數(shù)超過100w后 查詢性能就很差了,如何保證系統(tǒng)性能?

再比如,中國(guó)移動(dòng)有上億的用戶量,表如何設(shè)計(jì)?把所有用于存在于一個(gè)表?

所以,大數(shù)量的系統(tǒng),必須考慮表拆分-(表名字不一樣,但是結(jié)構(gòu)完全一樣),通用的幾種方式:(視情況而定)

1)按業(yè)務(wù)分,比如 手機(jī)號(hào)的表,我們可以考慮 130開頭的作為一個(gè)表,131開頭的另外一張表 以此類推

2)利用表拆分機(jī)制做分表

3)如果是交易系統(tǒng),我們可以考慮按時(shí)間軸拆分,當(dāng)日數(shù)據(jù)一個(gè)表,歷史數(shù)據(jù)弄到其它表。這里歷史數(shù)據(jù)的報(bào)表和查詢不會(huì)影響當(dāng)日交易。

此外,我們還得考慮緩存

這里的緩存獨(dú)立于應(yīng)用,依然是內(nèi)存的讀取,假如我們能減少數(shù)據(jù)庫(kù)頻繁的訪問,那對(duì)系統(tǒng)肯定大大有利的。比如一個(gè)電子商務(wù)系統(tǒng)的商品搜索,如果某個(gè)關(guān)鍵字的商品經(jīng)常被搜,那就可以考慮這部分商品列表存放到緩存(內(nèi)存中去),這樣不用每次訪問數(shù)據(jù)庫(kù),性能大大增加。

4、常見的提高高并發(fā)下訪問的效率的手段首先要了解高并發(fā)的的瓶頸在哪里?

1、可能是服務(wù)器網(wǎng)絡(luò)帶寬不夠

2.可能web線程連接數(shù)不夠

3.可能數(shù)據(jù)庫(kù)連接查詢上不去。

根據(jù)不同的情況,解決思路也不同。

1、像第一種情況可以增加網(wǎng)絡(luò)帶寬,DNS域名解析分發(fā)多臺(tái)服務(wù)器。

2、負(fù)載均衡,前置代理服務(wù)器nginx、apache等等

3、數(shù)據(jù)庫(kù)查詢優(yōu)化,讀寫分離,分表等等

最后復(fù)制一些在高并發(fā)下面需要常常需要處理的內(nèi)容

1、盡量使用緩存,包括用戶緩存,信息緩存等,多花點(diǎn)內(nèi)存來做緩存,可以大量減少與數(shù)據(jù)庫(kù)的交互,提高性能。

2、用jprofiler等工具找出性能瓶頸,減少額外的開銷。

3、優(yōu)化數(shù)據(jù)庫(kù)查詢語(yǔ)句,減少直接使用hibernate等工具的直接生成語(yǔ)句(僅耗時(shí)較長(zhǎng)的查詢做優(yōu)化)。

4、優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu),多做索引,提高查詢效率。

5、統(tǒng)計(jì)的功能盡量做緩存,或按每天一統(tǒng)計(jì)或定時(shí)統(tǒng)計(jì)相關(guān)報(bào)表,避免需要時(shí)進(jìn)行統(tǒng)計(jì)的功能。

6、能使用靜態(tài)頁(yè)面的地方盡量使用,減少容器的解析(盡量將動(dòng)態(tài)內(nèi)容生成靜態(tài)html來顯示)。

7、解決以上問題后,使用服務(wù)器集群來解決單臺(tái)的瓶頸問題。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品男女| 999久久久免费精品国产| 欧美aa在线观看| 国产黄色精品| 国产亚洲第一伦理第一区| 日本一区中文字幕| 亚洲精品影视| 亚洲日产av中文字幕| 三级欧美韩日大片在线看| 91日韩免费| 91综合视频| 日韩一区三区| 免费久久精品| 免费视频久久| 日韩在线观看中文字幕| 欧美日韩亚洲三区| 精品中国亚洲| 久久九九国产| 丝袜脚交一区二区| 日韩精品中文字幕吗一区二区| 日韩国产欧美视频| 久久国产精品色av免费看| 国产欧美另类| 麻豆理论在线观看| 丁香婷婷久久| 视频福利一区| 视频在线观看一区| 国产精品主播在线观看| 成人午夜亚洲| 欧美日韩精品在线一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一级二区| 国产色播av在线| 中文亚洲免费| 欧美伊人久久| 欧美日韩尤物久久| 亚洲在线一区| 久久爱www成人| 欧美日韩一二三四| 亚洲综合精品| 国产精品4hu.www| 国产麻豆久久| 亚洲精品在线国产| 国产一区二区三区亚洲| 日韩一级欧洲| 久久亚洲精精品中文字幕| 欧美一区二区三区激情视频| 免费国产亚洲视频| 精品一区二区三区免费看| 亚洲一级网站| 欧美在线首页| 久久在线视频免费观看| 日本va欧美va欧美va精品| 精品国产亚洲一区二区在线观看| 丁香六月综合| 中文字幕亚洲影视| 91欧美在线| 亚洲一区av| 免费高潮视频95在线观看网站| 蜜臀久久99精品久久久画质超高清| 免费在线亚洲欧美| 国产精品美女久久久| 久久a爱视频| 久久中文视频| 欧美三级第一页| 尤物在线精品| 久久精品三级| 亚洲深夜影院| 麻豆一区在线| 免费视频一区三区| 国产精品v亚洲精品v日韩精品| 婷婷激情一区| 国产精品一区二区三区www| 不卡中文一二三区| 奇米狠狠一区二区三区| 欧美精品高清| 国产精品日本一区二区不卡视频 | 国产午夜久久| 精品一区二区男人吃奶 | 国产在线视频欧美一区| 亚洲二区三区不卡| 免费在线日韩av| 日本亚洲不卡| 99在线精品免费视频九九视| 精品视频自拍| 日韩av电影一区| 男女性色大片免费观看一区二区 | 国产成人精品福利| 91精品福利观看| 亚洲婷婷丁香| 在线综合亚洲| 婷婷色综合网| 日韩成人亚洲| 麻豆久久一区| 日本午夜精品一区二区三区电影 | 一区二区国产在线观看| 日韩中文在线电影| 国精品产品一区| 国产精品三p一区二区| 亚洲资源av| 五月天久久777| 日韩精品网站| 波多视频一区| 黄色网一区二区| 欧美极品中文字幕| 国产精品美女久久久久久不卡| 久久av在线| 黄色av一区| 蜜臀91精品国产高清在线观看| 精品免费av在线| 韩国久久久久久| 欧美国产偷国产精品三区| 麻豆国产精品一区二区三区| 97久久超碰| 日本电影久久久| 日韩va亚洲va欧美va久久| 亚洲精品日本| 亚洲欧美在线专区| 中文字幕视频精品一区二区三区| 国产亚洲精品自拍| 亚洲免费黄色| 欧美精品一线| 亚洲欧美日韩综合国产aⅴ| 亚洲精品1区| 在线综合欧美| 一区二区三区四区在线观看国产日韩 | 奇米色欧美一区二区三区| 亚洲精品国模| 日韩成人在线看| 欧美精品一线| 欧美国产美女| 红杏一区二区三区| 欧美精品成人| 亚洲伊人影院| 国产精品一卡| 日韩国产在线一| 欧美午夜不卡| 午夜在线一区二区| 精品中文一区| 成人午夜网址| 亚洲视频www| 蜜臀av一区二区三区| 亚洲乱码久久| 国产一区二区精品福利地址| 久久久久久久久丰满| 香蕉精品999视频一区二区| 国产精品亚洲片在线播放| 日韩精品中文字幕第1页| 欧美日韩激情| 日韩午夜视频在线| 国产免费av一区二区三区| 久久美女精品| 在线国产精品一区| 91精品观看| 国产一区不卡| 岛国精品一区| 国产精品久久777777毛茸茸| 国产精品毛片| 黄色亚洲在线| 日韩不卡在线| 免费毛片在线不卡| 丰满少妇一区| 国产精品美女久久久| 综合激情网站| 国产精品一区二区中文字幕| 婷婷精品在线| 伊人精品久久| 日韩欧美一区二区三区在线观看| 国产精品日韩精品中文字幕| 中文日韩欧美| 精品国产一级| 亚洲一区二区成人| 亚洲精品一级| 亚洲综合日本| 成人在线网站| 国产精品天堂蜜av在线播放| 99精品综合| 国产精选一区| 日韩手机在线| 亚洲欧美日本国产| 日韩精品第一区| 精品国产乱码久久久久久1区2匹| 欧美日韩国产欧| 宅男在线一区| 欧美a级一区| 国产精品久久久久久久久久久久久久久 | 久久精品青草| 日韩一二三区在线观看| 日韩精品一级中文字幕精品视频免费观看 | av一区在线| 99国产精品自拍| 欧洲一级精品| 91精品蜜臀一区二区三区在线| 国产h片在线观看| 久久av影院| 麻豆久久一区| 捆绑调教美女网站视频一区| 精品国产不卡| 99国产一区| 国产欧美一区二区色老头|