亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java多線程學習總結(一)

2019-11-14 09:05:24
字體:
來源:轉載
供稿:網友

java線程

應用多線程一來可以為主線程分擔耗時較多的任務,提高主線程的響應速度,二來隨著計算機多處理能力的增加,可以提高計算機的使用性能。

首先我們來看java是如何創建線程的。創建一個線程傳統上有兩種方式,一種是繼承線程Thread類,創建Thread類實例,調用start()方法;還有一種就是實現runnable接口,創建new Thread(runnable()).start().兩種方式本質上還有創建一個線程類。還可以采用executer.execute()的方式提交一個線程,或者更高級的executorService.submit()方法來提交線程。

當多個線程同時運行的時候,由于它們之間對于進程的資源是共享的,對于共享的資源占有會有先后,因而會產生競爭關系,同時還會產生資源的一致性問題。這些關系綜合在一起會產生如果處理不當會產生不良的后果。當線程多的時候,多個線程之間的關系會有多種,一種是主子線程關系,即子線程為主線程服務,協助主線程完成一個任務,還有是并列關系,即為了提高程序響應速度,采用多個線程來并發處理同樣的任務,還有一種是順序/互補關系

1.主子關系

主子關系更多的是主線程將一個耗時較多的任務分給子線程,子線程處理完成后通知給主線程。這種關系通常不會產生對資源的同步訪問,但是會存在子線程處理完任務后通知主線程的問題。那么如何解決這個問題呢?其實,java中一個線程在執行完成任務后就會消亡,所以不會存在子線程主動通知主線程,那么子線程如何通知主線程呢?這里有兩種方式,一種是設置共享變量,子線程完成后,更改共享變量的值來達到通知主線程其任務完成的目的,另外一種就是主線程在空閑的時候主動探查子線程是否執行完成任務,一種方式是查看子線程是否還活動(alive)t.isAlive(),如果還活動,那么可以選擇等待(t.join()),也可以繼續執行它自己的任務?;蛘呷绻捎胑xecutorService.submit()方法來提交線程的話,會得到一個furture對象,用于檢測子線程是否完成(furture.isDone)。

2. 并列關系

并列關系是比較復雜的多線程之間的關系,因為會設計到多個線程對同一個共享資源的訪問,為了保證多個線程對同一個共享資源訪問不出現沖突,java設計了一整套的方法來保證。

2.1 原子操作

首先,如果多個線程對于一個資源的訪問過程都是一次性操作,而不存在操作過程中資源的中間狀態,那么這樣的操作稱為原子操作,如果線程對于資源的操作都是原子操作,那么多個線程之間就不需要同步,因為其本身并不存在沖突,那么對哪些資源的操作是原子操作呢?java中對于基本類型以及對象的引用類型,以及被聲明為volatile的變量

2.2 操作同步

那么如果對于一個資源的訪問不是原子操作,而是帶有中間狀態的操作會怎樣呢?單以簡單的c++為例,不考慮虛擬機的操作,c++可以分解為一下3步:

1)獲取c的值

2)將獲取的值加1;

3)將新的值寫回到c

這樣的3步操作如果有多個線程同時進行,那么后果就不是我們能夠預料的了。那么如何保證其操作的安全有序呢?java給出的解決方案是采用加鎖的方式來產生排他性操作,即我要訪問某個資源,如果已經被我占有了,那么我就會給它加上一把鎖,這樣,在我占有使用的過程中,讓其他線程無法使用,只有我用完了,把鎖釋放了后其他線程才能使用。那么如何加鎖呢?最普遍常見的方法是在方法上使用synchronized關鍵字。加上synchronized關鍵字的方法是在一個線程執行過程中會對其他線程產生排他性操作。那么synchronized關鍵字是否給方法上了鎖呢?答案是是的,這里涉及到內在鎖的概念,在java中,每一個對象都有一個內在鎖與它關聯,一個線程要想排他性的訪問一個對象的字段必須首先獲得對象的內部鎖,一旦獲得了該對象的內部鎖,在其釋放之前,其他線程是無法獲取到該鎖的。那么這個內部鎖到底是什么呢,我們可以理解為其就是對象本身,所以我們只要鎖定對象本身,我們就獲得了對象的訪問權,所以我們還可以顯式的去鎖定對象synchronized(this),這樣我們就可以更靈活的不去鎖定這個方法本身,而是鎖定方法中需要同步的某個代碼塊。進而我們還可以顯式的定義與每個字段關聯的對象鎖,方便對每個字段的排他性訪問而互不影響。

public class MsLunch {    

PRivate long c1 = 0;    

private long c2 = 0;    

private Object lock1 = new Object();    

private Object lock2 = new Object();     

public void inc1() {       

synchronized(lock1) {         

  c1++;        

}    

}     

public void inc2() {   

    synchronized(lock2) {    

        c2++;       

}    

}

}

2.3 鎖

鎖單獨講,其所應有的含義應該是能加鎖和釋放鎖。java.util.concurrent.locks中的lock接口就給出了這樣的解釋。它本身包含lock()和unlock()方法。這樣,我們就可以在需要加鎖的地方顯式的進行加鎖,lock.lock(),用完之后顯式的釋放掉鎖lock.unlock(),java.util.concurrent.locks中給我們提供了兩種常用的鎖的實現。

2.3.1 重入鎖ReentrantLock

重入鎖是在線程可以再次獲取到它已經擁有的鎖,即對對象進行二次加鎖。對象的內部鎖也是支持重入的。

2.3.2 重入讀寫鎖ReentrantReadWriteLock重入讀寫鎖是對一個資源既存在讀操作又存在寫操作的情況下定義的鎖,該鎖實際上包含兩把鎖,讀鎖和寫鎖。讀鎖對其他的讀操作沒有排他性,但是寫鎖對于其他操作有排他性,也就是說當獲取讀鎖的時候只要該資源沒有寫鎖就可以,但是當獲取寫鎖的時候必須要當前資源沒有鎖,否則該線程將會處于等待過程中。很顯然,讀寫鎖對于資源處于大多數讀操作少量寫操作的時候有很大的優勢,反之,會降低程序的性能。

3.互補關系

當兩個線程之間的執行是后一個線程需要前一個線程為其提供條件,而后一個線程的執行又為前一個線程的執行提供保障,我稱之為互補關系,典型的例子是生產-消費者模型。消費者需要生產者為其提供產品,消費者同樣需要消費產品為生產者提供空間。這樣的兩個線程之間,雖然也存在對共同資源的訪問-產品存放空間,這個通過前述各種同步就能夠很好地解決,但是還有一個新的問題,就是當生產者有了產品的時候如何通知消費者,同樣消費者消耗掉產品如何通知生產者繼續生產,如果通過前述的方式,二者設置共享變量,那么就會存在生產者和消費者不斷地對變量進行輪詢(Guarded Blocks),從而消耗大量cpu資源,又二者不屬于主從關系,因此無法使用join,那么解決這個問題就引入了新的機制,等待-通知機制(wait-notify/notifyAll)。當生產者發現生產空間已經占滿,就處于等待狀態wait,程序將生產者線程掛起,當消費者取走產品釋放出空間的時候,就通知notify生產者去生產產品,同樣當消費者發現沒有產品的時候,也處于等待狀態(wait),生產者將產品生產好以后,就通知(notify)消費者。采用顯式加鎖的方案是對鎖對象產生條件性(condition)等待,當對生產空間進行加鎖lock后,生產者對于生產空間添加產品,發出非空信號(notEmpty.signal()),同時產生非滿(notFull=lock.newCondition())等待(notFull.await()),消費者對于生產空間產生非空(notEmpty=lock.newCondition())等待(notEmpty.await()),當被喚醒后取走產品發出(notFull.signal())喚醒生產者。  


上一篇:Python3+sublime text3 環境

下一篇:通道

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线看视频国产欧美| 午夜精品理论片| 欧美在线视频a| 久久频这里精品99香蕉| 538国产精品一区二区免费视频| 日韩精品在线观看网站| 久久精品视频一| 九九热精品视频国产| 亚洲精品久久久久久久久久久| 欧美日韩福利视频| 国产精品久久激情| 精品露脸国产偷人在视频| 欧美www视频在线观看| www欧美日韩| 高清欧美性猛交xxxx| 欧美激情2020午夜免费观看| 日本成人精品在线| 日韩中文字幕精品视频| 精品一区二区三区三区| 国产精品69久久久久| 欧美日本中文字幕| 日本成人精品在线| 亚洲一区二区日本| 欧美日韩国产一区中文午夜| 日韩中文字幕亚洲| 国产精品av在线播放| 亚洲精品v欧美精品v日韩精品| 亚洲国模精品私拍| 日韩免费精品视频| 亚洲国产精品久久久久| 91精品久久久久久综合乱菊| 成人激情视频小说免费下载| 亚洲性视频网址| 91精品国产综合久久久久久久久| 国产成人福利网站| 亚洲四色影视在线观看| 亚洲va电影大全| 欧美激情在线一区| 国产精品国内视频| 俺去了亚洲欧美日韩| 一区二区三区四区在线观看视频| 亚洲精品视频网上网址在线观看| 欧美激情三级免费| 国产精品视频不卡| 欧美激情中文网| 美女啪啪无遮挡免费久久网站| 91九色国产社区在线观看| 全色精品综合影院| 国内伊人久久久久久网站视频| 国产精品免费久久久久影院| 国产69精品久久久久久| 国产一区二区视频在线观看| 国产精品久久久久aaaa九色| 亚洲97在线观看| 97超级碰在线看视频免费在线看| 国产日韩欧美另类| 在线播放日韩欧美| 亚洲欧美另类自拍| 亚洲欧洲在线看| 性欧美暴力猛交69hd| 美女撒尿一区二区三区| 97碰碰碰免费色视频| 欧美午夜视频在线观看| 国产精品久在线观看| 国产欧美日韩精品丝袜高跟鞋| 免费99精品国产自在在线| 久久91亚洲精品中文字幕| 不卡av在线播放| 国产一级揄自揄精品视频| 7m第一福利500精品视频| 一区二区三区在线播放欧美| 久久人人爽亚洲精品天堂| 欧美精品18videos性欧美| 国产精品www色诱视频| 国产视频在线观看一区二区| 亚洲精品欧美极品| 亚洲一区二区免费在线| 亚洲精品中文字幕女同| 国产精品日韩一区| 欧美日韩中文字幕日韩欧美| 国产视频精品va久久久久久| 午夜精品美女自拍福到在线| 高清日韩电视剧大全免费播放在线观看| 97在线视频免费播放| 欧美中文在线观看| 久久久久久久色| 日韩成人激情在线| 亚洲夜晚福利在线观看| 久热精品视频在线观看一区| 日韩精品视频在线| 欧美成人激情图片网| 日本精品视频在线播放| 欧美美最猛性xxxxxx| 性夜试看影院91社区| 国产精品成人va在线观看| 另类少妇人与禽zozz0性伦| 日韩大片在线观看视频| 91高清免费在线观看| 美日韩精品视频免费看| 日韩电影大全免费观看2023年上| 欧美视频在线免费看| 欧美一区二三区| 日韩在线视频观看正片免费网站| 国产一区二区三区免费视频| 日韩在线视频免费观看| 成人国产精品久久久久久亚洲| 日韩美女在线播放| 中文字幕亚洲综合久久| 久久精品成人欧美大片古装| 国产91热爆ts人妖在线| 一区二区福利视频| 色狠狠av一区二区三区香蕉蜜桃| 国内精品模特av私拍在线观看| 亚洲自拍偷拍第一页| 欧美高清视频一区二区| 一本色道久久综合狠狠躁篇怎么玩| 日韩精品欧美国产精品忘忧草| 伊人一区二区三区久久精品| 91综合免费在线| 日韩中文综合网| 国产亚洲一级高清| 日韩欧美中文字幕在线播放| 九九久久久久久久久激情| 亚洲国语精品自产拍在线观看| 性欧美办公室18xxxxhd| 成人日韩av在线| 欧美老女人性视频| 亚洲美女精品成人在线视频| 国产精品久久不能| 国产精品大陆在线观看| 有码中文亚洲精品| 亚洲直播在线一区| 国产精品爽爽爽| 久久久精品久久久| 久久精品国产69国产精品亚洲| 国产大片精品免费永久看nba| 久久影院资源站| 亚洲福利视频专区| 国产视频综合在线| 久久久av电影| 欧美不卡视频一区发布| 琪琪亚洲精品午夜在线| 久久精品中文字幕| 色综合久久天天综线观看| 欧美一级bbbbb性bbbb喷潮片| 日本成人在线视频网址| 国产精品18久久久久久首页狼| 国产在线观看精品一区二区三区| 欧美亚洲在线观看| 日韩av电影手机在线| 久久国产精品亚洲| 国产一区二区三区毛片| 成人字幕网zmw| 北条麻妃99精品青青久久| 成人国产精品久久久| 成人久久精品视频| 国产精品一香蕉国产线看观看| 国产精品久久久久久久久久久久| 一区二区三区美女xx视频| 日韩在线免费视频| 精品人伦一区二区三区蜜桃网站| 欧美日韩国内自拍| 4438全国成人免费| 精品国产一区二区三区四区在线观看|