『壹』 java 線程裡面 start() 方法是如何運行的
使該線程開始執行;Java 虛擬機調用該線程的 run 方法。
結果是兩個線程並發地運行;當前線程(從調用返回給 start 方法)和另一個線程(執行其 run 方法)。
多次啟動一個線程是非法的。特別是當線程已經結束執行後,不能再重新啟動。
上面是jdk文檔裡面
下面是源碼
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
發現沒有。。他調用了本地方法start0這個方法就是他底層實現的了。。所以我們並看不到他顯示的調用run方法。。因為他是在底層調用的。。虛擬機調用的。。
native方法就是本地方法。。是用其他語言寫的。。你自己也可以寫native方法。。就是JNI編程。。想看到是看不到的哦。。
『貳』 JAVA語言的特點有
Java語言的主要特點:
1. 跨平台性
所謂的跨平台性,是指軟體可以不受計算機硬體和操作系統的約束而在任意計算機環境下正常運行。這是軟體發展的趨勢和編程人員追求的目標。之所以這樣說,是因為計算機硬體的種類繁多,操作系統也各不相同,不同的用戶和公司有自己不同的計算機環境偏好,而軟體為了能在這些不同的環境里正常運行,就需要獨立於這些平台。
而在Java語言中, Java自帶的虛擬機很好地實現了跨平台性。 Java源程序代碼經過編譯後生成二進制的位元組碼是與平台無關的,但是可被Java虛擬機識別的一種機器碼指令。 Java虛擬機提供了一個位元組碼到底層硬體平台及操作系統的屏障,使得Java語言具備跨平台性。
2. 面向對象
面向對象是指以對象為基本粒度,其下包含屬性和方法。對象的說明用屬性表達,而通過使用方法來操作這個對象。面向對象技術使得應用程序的開發變得簡單易用,節省代碼。Java是一種面向對象的語言,也繼承了面向對象的諸多好處,如代碼擴展、代碼復用等。
3. 安全性
安全性可以分為四個層面,即語言級安全性、編譯時安全性、運行時安全性、可執行代碼安全性。語言級安全性指Java的數據結構是完整的對象,這些封裝過的數據類型具有安全性。編譯時要進行Java語言和語義的檢查,保證每個變數對應一個相應的值,編譯後生成Java類。運行時Java類需要類載入器載入,並經由位元組碼校驗器校驗之後才可以運行。 Java類在網路上使用時,對它的許可權進行了設置,保證了被訪問用戶的安全性。
4. 多線程
多線程在操作系統中已得到了最成功的應用。多線程是指允許一個應用程序同時存在兩個或兩個以上的線程,用於支持事務並發和多任務處理。 Java除了內置的多線程技術之外,還定義了一些類、方法等來建立和管理用戶定義的多線程。
5. 簡單易用
Java源代碼的書寫不拘泥於特定的環境,可以用記事本、文本編輯器等編輯軟體來實現,然後將源文件進行編譯,編譯通過後可直接運行,通過調試則可得到想要的結果。
『叄』 java多線程詳細理解
多線程:指的是這個程序(一個進程)運行時產生了不止一個線程
並行與並發:
並行:多個cpu實例或者多台機器同時執行一段處理邏輯,是真正的同時。
並發:通過cpu調度演算法,讓用戶看上去同時執行,實際上從cpu操作層面不是真正的同時。並發往往在場景中有公用的資源,那麼針對這個公用的資源往往產生瓶頸,我們會用TPS或者QPS來反應這個系統的處理能力。
線程安全:經常用來描繪一段代碼。指在並發的情況之下,該代碼經過多線程使用,線程的調度順序不影響任何結果。這個時候使用多線程,我們只需要關注系統的內存,cpu是不是夠用即可。反過來,線程不安全就意味著線程的調度順序會影響最終結果,如不加事務的轉賬代碼:
同步:Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問成為線程安全,來保證結果的准確。如上面的代碼簡單加入@synchronized關鍵字。在保證結果准確的同時,提高性能,才是優秀的程序。線程安全的優先順序高於性能。
『肆』 java中一個線程怎麼通知另外一個線程進行資料庫事務回滾或者提交
需要一個 全局的標志位 來控制 線程是否回滾
在 運行的線程中 改變 全局的標志位 然後 回滾線程 判定這個 標志位的 狀態 來進行 是否的回滾開關。
『伍』 java事務和鎖的問題,如果事務沒提交,其他線程能修改資料庫中的同條數據嗎
題主,你說的這種情況是允許出現的。這與事務的隔離程度有關。
如果事務隔離程度設置得當,就沒有必要顯式的通過synchronized保護資源(除非資源是某個service中的公共屬性)。
『陸』 Java線程的作用什麼
線程同步我們可以在計算機上運行各種計算機軟體程序。每一個運行的程序可能包括多個獨立運行的線程(Thread)。 線程(Thread)是一份獨立運行的程序,有自己專用的運行棧。線程有可能和其他線程共享一些資源,比如,內存,文件,資料庫等。
當多個線程同時讀寫同一份共享資源的時候,可能會引起沖突。這時候,我們需要引入線程「同步」機制,即各位線程之間要有個先來後到,不能一窩蜂擠上去搶作一團。
同步這個詞是從英文synchronize(使同時發生)翻譯過來的。我也不明白為什麼要用這個很容易引起誤解的詞。既然大家都這么用,咱們也就只好這么將就。
線程同步的真實意思和字面意思恰好相反。線程同步的真實意思,其實是「排隊」:幾個線程之間要排隊,一個一個對共享資源進行操作,而不是同時進行操作。
因此,關於線程同步,需要牢牢記住的第一點是:線程同步就是線程排隊。同步就是排隊。線程同步的目的就是避免線程「同步」執行。這可真是個無聊的繞口令。
關於線程同步,需要牢牢記住的第二點是 「共享」這兩個字。只有共享資源的讀寫訪問才需要同步。如果不是共享資源,那麼就根本沒有同步的必要。
關於線程同步,需要牢牢記住的第三點是,只有「變數」才需要同步訪問。如果共享的資源是固定不變的,那麼就相當於「常量」,線程同時讀取常量也不需要同步。至少一個線程修改共享資源,這樣的情況下,線程之間就需要同步。
關於線程同步,需要牢牢記住的第四點是:多個線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
為了加深理解,下面舉幾個例子
有兩個采購員,他們的工作內容是相同的,都是遵循如下的步驟:
(1)到市場上去,尋找並購買有潛力的樣品。
(2)回到公司,寫報告。
這兩個人的工作內容雖然一樣,他們都需要購買樣品,他們可能買到同樣種類的樣品,但是他們絕對不會購買到同一件樣品,他們之間沒有任何共享資源。所以,他們可以各自進行自己的工作,互不幹擾。這兩個采購員就相當於兩個線程;兩個采購員遵循相同的工作步驟,相當於這兩個線程執行同一段代碼。
下面給這兩個采購員增加一個工作步驟。采購員需要根據公司的「布告欄」上面公布的信息,安排自己的工作計劃。 這兩個采購員有可能同時走到布告欄的前面,同時觀看布告欄上的信息。這一點問題都沒有。因為布告欄是只讀的,這兩個采購員誰都不會去修改布告欄上寫的信息 下面增加一個角色。一個辦公室行政人員這個時候,也走到了布告欄前面,准備修改布告欄上的信息。
如果行政人員先到達布告欄,並且正在修改布告欄的內容。兩個采購員這個時候,恰好也到了。這兩個采購員就必須等待行政人員完成修改之後,才能觀看修改後的信息。
如果行政人員到達的時候,兩個采購員已經在觀看布告欄了。那麼行政人員需要等待兩個采購員把當前信息記錄下來之後,才能夠寫上新的信息。
上述這兩種情況,行政人員和采購員對布告欄的訪問就需要進行同步。因為其中一個線程(行政人員)修改了共享資源(布告欄)。而且我們可以看到,行政人員的工作流程和采購員的工作流程(執行代碼)完全不同,但是由於他們訪問了同一份可變共享資源(布告欄),所以他們之間需要同步。
同步鎖
前面講了為什麼要線程同步,下面我們就來看如何才能線程同步。
線程同步的基本實現思路還是比較容易理解的。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙。哪個線程獲取了這把鑰匙,才有權利訪問該共享資源。
生活中,我們也可能會遇到這樣的例子。一些超市的外面提供了一些自動儲物箱。每個儲物箱都有一把鎖,一把鑰匙。人們可以使用那些帶有鑰匙的儲物箱,把東西放到儲物箱裡面,把儲物箱鎖上,然後把鑰匙拿走。這樣,該儲物箱就被鎖住了,其他人不能再訪問這個儲物箱。(當然,真實的儲物箱鑰匙是可以被人拿走復制的,所以不要把貴重物品放在超市的儲物箱裡面。於是很多超市都採用了電子密碼鎖。)
線程同步鎖這個模型看起來很直觀。但是,還有一個嚴峻的問題沒有解決,這個同步鎖應該加在哪裡? 當然是加在共享資源上了。反應快的讀者一定會搶先回答。
沒錯,如果可能,我們當然盡量把同步鎖加在共享資源上。一些比較完善的共享資源,比如,文件系統,資料庫系統等,自身都提供了比較完善的同步鎖機制。我們不用另外給這些資源加鎖,這些資源自己就有鎖。
但是,大部分情況下,我們在代碼中訪問的共享資源都是比較簡單的共享對象。這些對象裡面沒有地方讓我們加鎖。
讀者可能會提出建議:為什麼不在每一個對象內部都增加一個新的區域,專門用來加鎖呢?這種設計理論上當然也是可行的。問題在於,線程同步的情況並不是很普遍。如果因為這小概率事件,在所有對象內部都開辟一塊鎖空間,將會帶來極大的空間浪費。得不償失。
於是,現代的編程語言的設計思路都是把同步鎖加在代碼段上。確切的說,是把同步鎖加在「訪問共享資源的代碼段」上。這一點一定要記住,同步鎖是加在代碼段上的。
同步鎖加在代碼段上,就很好地解決了上述的空間浪費問題。但是卻增加了模型的復雜度,也增加了我們的理解難度。
『柒』 Java開發中線程的安全問題以及產生的原因
Java如何保證原子性常用的保證Java操作原子性的工具是鎖和同步方法(或者同步代碼塊)。使用鎖,可以保證同一時間只有一個線程能拿到鎖,也就保證了同一時間只有一個線程能執行申請鎖和釋放鎖之間的代碼。
與鎖類似的是同步方法或者同步代碼塊。使用非靜態同步方法時,鎖住的是當前實例;使用靜態同步方法時,鎖住的是該類的Class對象;使用靜態代碼塊時,鎖住的是synchronized關鍵字後面括弧內的對象。