日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程与并发控制

發(fā)布時間:2024/4/14 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程与并发控制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

三、線程的幾種狀態(tài)

  在Java當中,線程通常都有五種狀態(tài),創(chuàng)建、就緒、運行、阻塞和死亡。

  第一是創(chuàng)建狀態(tài)。在生成線程對象,并沒有調(diào)用該對象的start方法,這是線程處于創(chuàng)建狀態(tài)。

  第二是就緒狀態(tài)。當調(diào)用了線程對象的start方法之后,該線程就進入了就緒狀態(tài),但是此時線程調(diào)度程序還沒有把該線程設(shè)置為當前線程,此時處于就緒狀態(tài)。在線程運行之后,從等待或者睡眠中回來之后,也會處于就緒狀態(tài)。

  第三是運行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當前線程,此時線程就進入了運行狀態(tài),開始運行run函數(shù)當中的代碼。

  第四是阻塞狀態(tài)。線程正在運行的時候,被暫停,通常是為了等待某個時間的發(fā)生(比如說某項資源就緒)之后再繼續(xù)運行。sleep,suspend,wait(兩者的區(qū)別是是否釋放鎖)等方法都可以導(dǎo)致線程阻塞。

  第五是死亡狀態(tài)。如果一個線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后,該線程就會死亡。對于已經(jīng)死亡的線程,無法再使用start方法令其進入就緒

synchronized關(guān)鍵字使用說明 synchronized只能標記非抽象的方法,不能標識成員變量。 要同步靜態(tài)方法,需要一個用于整個類對象的鎖,這個對象是就是這個類(XXX.class)。 例如: public static synchronized int setName(String name){ ????? Xxx.name = name; } 等價于
public static int setName(String name){
????? synchronized(Xxx.class){
??????????? Xxx.name = name;
????? }
} 1、鎖的原理 ? Java中每個對象都有一個內(nèi)置鎖 ? 當程序運行到非靜態(tài)的synchronized同步方法上時,自動獲得與正在執(zhí)行代碼類的當前實例(this實例)有關(guān)的鎖。獲得一個對象的鎖也稱為獲取鎖、鎖定對象、在對象上鎖定或在對象上同步。 ? 當程序運行到synchronized同步方法或代碼塊時才該對象鎖才起作用。 ? 一個對象只有一個鎖。所以,如果一個線程獲得該鎖,就沒有其他線程可以獲得鎖,直到第一個線程釋放(或返回)鎖。這也意味著任何其他線程都不能進入該對象上的synchronized方法或代碼塊,直到該鎖被釋放。 ? 釋放鎖是指持鎖線程退出了synchronized同步方法或代碼塊。 ? 關(guān)于鎖和同步,有一下幾個要點: 1)、只能同步方法,而不能同步變量和類; 2)、每個對象只有一個鎖;當提到同步時,應(yīng)該清楚在什么上同步?也就是說,在哪個對象上同步? 3)、不必同步類中所有的方法,類可以同時擁有同步和非同步方法。 4)、如果兩個線程要執(zhí)行一個類中的synchronized方法,并且兩個線程使用相同的實例來調(diào)用方法,那么一次只能有一個線程能夠執(zhí)行方法,另一個需要等待,直到鎖被釋放。也就是說:如果一個線程在對象上獲得一個鎖,就沒有任何其他線程可以進入(該對象的)類中的任何一個同步方法。 5)、如果線程擁有同步和非同步方法,則非同步方法可以被多個線程自由訪問而不受鎖的限制。 6)、線程睡眠時,它所持的任何鎖都不會釋放。 7)、線程可以獲得多個鎖。比如,在一個對象的同步方法里面調(diào)用另外一個對象的同步方法,則獲取了兩個對象的同步鎖。 8)、同步損害并發(fā)性,應(yīng)該盡可能縮小同步范圍。同步不但可以同步整個方法,還可以同步方法中一部分代碼塊。 9)、在使用同步代碼塊時候,應(yīng)該指定在哪個對象上同步,也就是說要獲取哪個對象的鎖。例如: ??? public int fix(int y) {
??????? synchronized (this) {
??????????? x = x - y;
??????? }
??????? return x;
??? } ? 當然,同步方法也可以改寫為非同步方法,但功能完全一樣的,例如: ??? public synchronized int getX() {
??????? return x++;
??? } ??? public int getX() {
??????? synchronized (this) {
??????????? return x;
??????? }
??? } 效果是完全一樣的。 在具體的Java代碼中需要完成一下兩個操作: 把競爭訪問的資源類Foo變量x標識為private; 同步哪些修改變量的代碼,使用synchronized關(guān)鍵字同步方法或代碼。

????? JAVA的多線程是搶占式(preemptive)的,意思是調(diào)度機制會為每個線程提供時間片,并且通過強制中斷來轉(zhuǎn)換到下一個線程。搶占式的實現(xiàn)方式對線程的個數(shù)有一個限制。與其相對的是協(xié)作式(cooperative)的,協(xié)作式的多任務(wù)系統(tǒng)對任務(wù)的數(shù)量是沒有限制的,因為任務(wù)是自動讓出資源的,并且上下文的轉(zhuǎn)換成本較小。

??????線程中斷(Interruption):

??????線程有以下幾種狀態(tài):初始態(tài)(New), 可運行(Runnable), 阻塞(Blocked), 終止(Dead)。線程被創(chuàng)建的即刻為初始態(tài),系統(tǒng)為線程分配必要的資源,所有的資源就位后,萬事具備,只欠東風,此刻進入可運行狀態(tài),調(diào)度器可隨時使線程運行或繼續(xù)等待(Blocked);

????? 處于阻塞狀態(tài)的線程不能獲得CPU 時間,以下事件可以使一個線程進入阻塞狀態(tài):

????? a) 調(diào)用了sleep() 方法(jion()方法等同)

????? b) 調(diào)用了wait() 方法

????? c) 等待同步鎖,比如進入synchronized 方法

????? d) 等待 I/O

????? 所謂中斷是指CPU終止當前運行的任務(wù),使其讓出資源讓其他任務(wù)操作。java多線程中通常情況下所說的中斷,就是從線程的run() 方法跳出來. 當然最直接的方法就是等待 run()方法執(zhí)行完畢自動退出。但是多數(shù)情況下我們的線程都是長任務(wù)線程,比如守護線程(伺服線程),需要長時間不間斷運行。一種可選方法是通過控制變量(這個控制變量,通常是全局變量,以便程序在任何時候任何地點都可以訪問到,并且對控制變量的操作應(yīng)當是同步的,在java中我們可以選擇使用volatile 變量)。

轉(zhuǎn)載于:https://www.cnblogs.com/csxf/p/3672674.html

總結(jié)

以上是生活随笔為你收集整理的Java多线程与并发控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。