?

Java多線程訪問控制管理分析

2014-10-21 19:57梁德華
計算機光盤軟件與應用 2014年24期
關鍵詞:多線程同步控制

摘 要:本文分析并描述了Java多線程訪問控制的基本方法和多線程同步訪問的控制方法,以及使用優先級解決死鎖問題的方法,并且用簡單語句作說明。

關鍵詞:Java;多線程;同步控制

中圖分類號:TP312

1 Java多線程的基本控制

在Java中,一個線程從創建到死亡稱為線程的一個生命周期,它的生命周期有多個不同狀態,一般為:Enabled、Running、Sleeping、Joining、Waiting、Locking。對于線程的這些狀態,Java在Thread類中定義了一些方法可以在程序中手動控制。要結束一個線程的運行,可以使用stop()方法。但是stop()方法并不是非常安全的,它會強制中止一個線程的運行,但是會釋放這個線程鎖住的所有對象,這些對象被解鎖后就可能被其他的線程直接訪問,導致錯誤的結果。因此,要中止一個線程,最好是設置一個標志位,在run()方法中根據這個標記來判斷是否繼續保持狀態。要中止線程的時候,可以使用setRunFlag()方法。

在暫停和恢復線程執行時也會出現同樣的問題??梢允褂肨hread類中supspend()和resume()方法來暫停和恢復,但不建議使用,它們容易造成線程的死鎖。解決的方法也是使用一定的標志變量。使用setsuspendFlag(true)可以暫停線程的執行,暫停時間的指定是通過sleep()方法來實現,暫停結束就回到等待隊列,不是恢復執行狀態。所以sleep()方法不能精確控制線程計劃工作的時間尺度。

下面用模擬一個龜兔接力跑的實例來演示Java多線程的sleep()方法的控制。模擬的接力跑中有一只烏龜和一只兔子。當兔子跑完400米將接力棒交給烏龜,烏龜跑完400米后結束。部分代碼如下:

2 Java多線程的同步控制

多線程程序中,多個線程可以共享相同資源,這可能導致沖突。Java使用同步機制來解決這個問題。這個同步機制使用synchronized關鍵字,它主要用于多線程共享數據的同步,使用加鎖的機制,控制變量或代碼塊在某個時間段只能被一個線程訪問。

Java中synchronized既可作為方法的修飾符,鎖住方法,也可在方法內部鎖住部分語句。Synchronized方法和synchronized代碼塊在使用時是有區別的。將訪問共享數據的方法加上synchronized,例如把synchronized當作方法修飾符:

Public synchronized void m1(){……}

這就是同步方法。當某個線程調用這個同步方法時,會開始執行直到完畢為止,其它想要調用這個方法的線程會進入阻塞狀態,一直到這個方法獲得釋放為止。使用synchronized來修飾一個比較大的方法時,也會鎖住其它一些不需要鎖住的數據,導致程序效率下降。Synchronized塊則是把方法內的某段代碼使用synchronized來修飾,可以減少同步范圍。例如:Public void m1(){ …… Synchronized(so){ …… }}

使用synchronized修飾時,就代表著同步機制啟動,某個時刻只能某個線程訪問數據和資源,阻止其它線程訪問,這種狀態即使出現阻塞和死鎖現象也不會解除。

3 Java多線程的死鎖問題

為了控制資源的訪問沖突,需要使用synchronized對訪問資源進行加鎖,但加鎖會帶來一個潛在的危險:死鎖。如果兩個或兩個以上的線程在等待兩個或兩個以上的鎖被釋放,但實際上這些鎖根本就不會被解鎖,那么這些線程就會進入無限等待的狀態,稱之為死鎖。線程等待解鎖的這種狀態有時也被稱作堵塞。死鎖例子部分代碼如下:

4 Java多線程的優先級

在多線程編程中要預防死鎖的發生,不然死鎖后會導致浪費大量時間和資源。防止死鎖的方法很多,最重要的就是防止循環等待的發生??梢允褂迷O置線程的優先級來解決這一問題。同一時刻會有很多在排隊等待資源的線程,它們各自的重要性是不同的??梢再x予每個線程不同的優先級,讓任務更急的線程獲得更高的優先級,更快的進入執行狀態。

Java中提供了10個等級的線程優先級,最低為1,最高為10,默認優先級為5。對于一個新創建的線程,如果沒有指定優先級,它的優先級將和它的父線程優先級一致。使用setPriority()方法可以為線程指定優先級。

例如:int newPrio=Thread.currentThread( ).getPriority( )+1;

Thread.currentThread( ).setPriority(newPrio);

5 結束語

Java多線程編程可以合理的調用多項任務,功能非常強大。但是多線程共享數據或資源時會導致執行的錯誤,因此多線程訪問控制管理機制在解決數據不一致性、資源沖突等問題時是非常有用的。高質量的使用Java多線程訪問控制管理機制可以提高程序運行效率,縮短任務執行的時間。

參考文獻:

[1]明日科技.Java從入門到精通(3版)[M].北京:清華大學出版社,2013.

[2]路勇.Java多線程同步問題分析[J].軟件,2012(04):31-33.

作者簡介:梁德華(1977-),男,江西瑞昌人,華中科技大學軟件工程碩士,講師,研究方向:軟件工程、軟件技術教學。

作者單位:江西旅游商貿職業學院 藝術傳媒與計算機分院,南昌 330100

猜你喜歡
多線程同步控制
基于EtherCAT網絡的金剛線多線切割機雙主軸同步控制
Java并發工具包對并發編程的優化
基于云模型的舵機同步控制
基于廣義預測的雙轉動掃描系統同步控制
一個具有完全四翼形式的四維混沌系統同步控制
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合