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

您的位置:首頁技術文章
文章詳情頁

Java 實現并發的幾種方式小結

瀏覽:127日期:2022-08-12 13:39:41
Java實現并發的幾種方法

Java程序默認以單線程方式運行。

synchronized

Java 用過synchronized 關鍵字來保證一次只有一個線程在執行代碼塊。

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

Volatile 關鍵字保證任何線程在讀取Volatile修飾的變量的時候,讀取的都是這個變量的最新數據。

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();}

創建thread會有很多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結束executor.awaitTermination();System.out.println('Finished all threads'); }}Futures 和 Callables

因為Runnable對象無法向調用者返回結果,我們可以用Callable類來返回結果。

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的基礎上增加了異步調用的功能。callback()函數Thread執行結束的時候會自動調用。

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; }}

補充:Java如何處理高并發的情況

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

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

異步,執行完函數或方法后,不必阻塞性地等待返回值或消息,只需要向系統委托一個異步過程,那么當系統接收到返回值或消息時,系統會自動觸發委托的異步過程,從而完成一個完整的流程。異步就是,做一件事情,不影響做其他事情。

同步關鍵字synchronized,假如這個同步的監視對象是類的話,那么如果當一個對象 訪問類里面的同步方法的話,那么其它的對象如果想要繼續訪問類里面的這個同步方法的話,就會進入阻塞,只有等前一個對象 執行完該同步方法后當前對象才能夠繼續執行該方法。這就是同步。相反,如果方法前沒有同步關鍵字修飾的話,那么不同的對象可以在同一時間訪問同一個方法,這就是異步。

臟數據:就是指當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據,那么另外一個事務讀到的這個數據是臟數據(Dirty Data),依據臟數據所做的操作可能是不正確的。

1、什么是并發問題

多個進程或線程同時(在同一段時間內)訪問同一資源會產生并發問題。

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

處理并發和同同步問題主要是通過鎖機制。

2、如何處理并發和同步

一種是java中的同步鎖,典型的就是同步關鍵字synchronized。

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

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

1)使用同步關鍵字synchronized

2)使用lock鎖機制其中也包括相應的讀寫鎖

悲觀鎖,正如其名,它指的是對數據被外界(包括本系統當前的其他事務,以及來自 外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。

樂觀鎖,大多是基于數據版本 Version )記錄機制實現。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個 “version” 字段來 實現。 讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提 交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據 版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。

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

【謹防在此,面試官會問到死鎖的相關問題!!!關于死鎖的問題,在其余某篇博客都有說明】

3、常見并發同步案例分析案例一、訂票系統案例

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

假定我們采用了同步機制或者數據庫物理鎖機制,如何保證1w個人還能同時看到有票,顯然會犧牲性能,在高并發網站中是不可取的。

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

如何實現樂觀鎖:

前提:在現有表當中增加一個冗余字段,version版本號, long類型

原理:

1)只有當前版本號>=數據庫表版本號,才能提交

2)提交成功后,版本號version ++

案例二、股票交易系統、銀行系統,大數據量你是如何考慮的

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

再比如,中國移動有上億的用戶量,表如何設計?把所有用于存在于一個表?

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

1)按業務分,比如 手機號的表,我們可以考慮 130開頭的作為一個表,131開頭的另外一張表 以此類推

2)利用表拆分機制做分表

3)如果是交易系統,我們可以考慮按時間軸拆分,當日數據一個表,歷史數據弄到其它表。這里歷史數據的報表和查詢不會影響當日交易。

此外,我們還得考慮緩存

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

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

1、可能是服務器網絡帶寬不夠

2.可能web線程連接數不夠

3.可能數據庫連接查詢上不去。

根據不同的情況,解決思路也不同。

1、像第一種情況可以增加網絡帶寬,DNS域名解析分發多臺服務器。

2、負載均衡,前置代理服務器nginx、apache等等

3、數據庫查詢優化,讀寫分離,分表等等

最后復制一些在高并發下面需要常常需要處理的內容

1、盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與數據庫的交互,提高性能。

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

3、優化數據庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。

4、優化數據庫結構,多做索引,提高查詢效率。

5、統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。

6、能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。

7、解決以上問題后,使用服務器集群來解決單臺的瓶頸問題。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲中午字幕| 日韩专区在线视频| 四虎精品一区二区免费| 亚洲欧美日韩视频二区| 91久久中文| 久久电影一区| 亚州精品视频| 日本视频一区二区| 青青草伊人久久| 国产日韩视频在线| 国产精品日本一区二区不卡视频| 欧美激情福利| av日韩中文| 精品国产乱码久久久久久樱花| 久久精品系列| 日韩另类视频| 国产一区二区精品| 亚洲v天堂v手机在线| 国产乱码精品一区二区三区四区| 麻豆精品视频在线观看视频| 中文字幕人成乱码在线观看| 亚洲国内精品| 蜜桃视频在线观看一区| 97精品资源在线观看| 麻豆精品久久| 欧美黄色网页| 在线视频精品| 免费在线亚洲| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精久久久| 国产精品成久久久久| 欧美日韩水蜜桃| 亚洲视频国产精品| 国产福利资源一区| 久久久精品久久久久久96 | 欧美羞羞视频| 国产精品婷婷| 国产精品一区二区美女视频免费看| 久久精品毛片| 亚洲在线一区| 国产精品白浆| 日韩高清中文字幕一区二区| 国产亚洲高清视频| 国产精品分类| 国产中文欧美日韩在线 | 视频一区二区三区中文字幕| 国产精品网在线观看| 日韩欧美少妇| 97精品视频在线看| 久久亚洲色图| 老鸭窝一区二区久久精品| 国产在线欧美| 欧美日一区二区三区在线观看国产免 | 国产亚洲电影| 精精国产xxxx视频在线播放 | 另类亚洲自拍| 国产+成+人+亚洲欧洲在线| 亚洲少妇在线| 精品国产91| 亚洲一区欧美| 日本а中文在线天堂| 亚洲涩涩av| 伊人久久av| 欧美一级二级三级视频| а√在线中文在线新版| 一区二区电影在线观看| 偷拍精品精品一区二区三区| 日本vs亚洲vs韩国一区三区二区| 色偷偷色偷偷色偷偷在线视频| 亚洲人妖在线| 久久不卡国产精品一区二区| 免播放器亚洲| 在线看片国产福利你懂的| 亚洲一区二区三区无吗| 日韩av福利| 欧美激情aⅴ一区二区三区| 蜜臀久久99精品久久久久久9| 国产精品99一区二区三| 国产探花一区在线观看| 女生影院久久| 欧美精品影院| 久久福利一区| 日韩另类视频| 风间由美中文字幕在线看视频国产欧美 | 精品视频一区二区三区四区五区 | 国产精品黄网站| 日本不卡中文字幕| 黄色日韩精品| 国产精品蜜芽在线观看| 国产亚洲精品精品国产亚洲综合| 三级在线观看一区二区| 1024精品一区二区三区| 天堂av在线| 精品国产亚洲日本| 欧美片第1页综合| 午夜亚洲福利| 免费观看在线色综合| 美女毛片一区二区三区四区| 国产精品igao视频网网址不卡日韩 | 美女精品视频在线| 日韩成人在线看| 午夜在线视频观看日韩17c| 久久黄色影院| 日韩欧美一区二区三区免费看| 国产福利一区二区精品秒拍| 日本特黄久久久高潮| 亚洲精品少妇| 自拍自偷一区二区三区| 免费人成精品欧美精品| 亚洲一区二区免费看| 一区二区亚洲精品| 激情久久久久久久| 激情六月综合| 欧美亚洲国产精品久久| 国产成人在线中文字幕| 久久精品国产99国产| 国产精品久久久免费| 国产美女亚洲精品7777| 日韩av影院| 久久国产欧美日韩精品| 69堂免费精品视频在线播放| 国产美女久久| 国产精东传媒成人av电影| 欧美经典一区| 精品国产黄a∨片高清在线| 激情久久99| 色综合五月天| 久久久精品五月天| 欧美日中文字幕| 亚洲高清av| 亚洲制服少妇| 日韩精品一区二区三区中文| 欧美精品三级在线| 欧美国产另类| 日本免费一区二区三区四区| 亚洲成人一区在线观看| 日本午夜精品| 精品一区二区三区中文字幕在线| 精品国产鲁一鲁****| 久久久久久网| 亚洲天堂久久| 亚洲中字黄色| 久久精品72免费观看| 精品亚洲免a| 日韩成人a**站| 亚洲手机在线| 亚洲毛片在线| 精品伊人久久久| 欧美手机在线| 亚洲视频二区| 国产精品宾馆| 成人日韩在线| 免费日韩精品中文字幕视频在线| 亚洲精品在线二区| 国产精品va视频| 91看片一区| 视频一区中文字幕| 久久av免费| 在线成人动漫av| 日韩精品一二三四| 午夜亚洲福利| 精品理论电影在线| 欧美福利专区| 热久久久久久| 伊人久久在线| 亚洲综合中文| 97精品国产一区二区三区| 国产一区白浆| 久久精品国产久精国产爱| 亚洲激情久久| 国产精品久久久免费| 亚洲网站视频| 国产三级一区| 天堂网av成人| 亚洲精选成人| 精品入口麻豆88视频| 亚洲欧美日本日韩| 另类小说一区二区三区| 黄色不卡一区| 国产欧美日韩影院| 一区二区小说| 久久国产精品免费精品3p | 日韩国产综合| 亚洲精品麻豆| 精品国产免费人成网站| 亚洲深夜福利在线观看| 久久久久久久欧美精品| 亚洲在线免费| 精品国产a一区二区三区v免费| 一区二区亚洲精品| 麻豆91在线播放| 日韩影院免费视频| jizzjizz中国精品麻豆| 日韩欧美中文字幕在线视频| 私拍精品福利视频在线一区| 国产精品资源| 亚洲一区二区毛片| 91亚洲国产高清| 日本免费在线视频不卡一不卡二| 国产精品久久久久久妇女|