導航:首頁 > 編程語言 > java多線程同步的方法

java多線程同步的方法

發布時間:2022-09-13 11:58:50

java中線程同步方法有哪些

JAVA中線程同步方法一般有以下三種:
1 wait方法:
該方法屬於Object的方法,wait方法的作用是使得當前調用wait方法所在部分(代碼塊)的線程停止執行,並釋放當前獲得的調用wait所在的代碼塊的鎖,並在其他線程調用notify或者notifyAll方法時恢復到競爭鎖狀態(一旦獲得鎖就恢復執行)。
調用wait方法需要注意幾點:
第一點:wait被調用的時候必須在擁有鎖(即synchronized修飾的)的代碼塊中。
第二點:恢復執行後,從wait的下一條語句開始執行,因而wait方法總是應當在while循環中調用,以免出現恢復執行後繼續執行的條件不滿足卻繼續執行的情況。
第三點:若wait方法參數中帶時間,則除了notify和notifyAll被調用能激活處於wait狀態(等待狀態)的線程進入鎖競爭外,在其他線程中interrupt它或者參數時間到了之後,該線程也將被激活到競爭狀態。
第四點:wait方法被調用的線程必須獲得之前執行到wait時釋放掉的鎖重新獲得才能夠恢復執行。
2 notify方法和notifyAll方法:
notify方法通知調用了wait方法,但是尚未激活的一個線程進入線程調度隊列(即進入鎖競爭),注意不是立即執行。並且具體是哪一個線程不能保證。另外一點就是被喚醒的這個線程一定是在等待wait所釋放的鎖。
notifyAll方法則喚醒所有調用了wait方法,尚未激活的進程進入競爭隊列。
3 synchronized關鍵字:
第一點:synchronized用來標識一個普通方法時,表示一個線程要執行該方法,必須取得該方法所在的對象的鎖。
第二點:synchronized用來標識一個靜態方法時,表示一個線程要執行該方法,必須獲得該方法所在的類的類鎖。
第三點:synchronized修飾一個代碼塊。類似這樣:synchronized(obj) { //code.... }。表示一個線程要執行該代碼塊,必須獲得obj的鎖。這樣做的目的是減小鎖的粒度,保證當不同塊所需的鎖不沖突時不用對整個對象加鎖。利用零長度的byte數組對象做obj非常經濟。

Ⅱ Java中線程怎麼同步

1、使用線程類自帶的join方法,將子線程加入到主線程,在子線程執行完之後,在執行主線程邏輯。

例如

[java]view plain

  • publicstaticvoidcallableDemo()

  • throwsInterruptedException

  • {

  • System.out.println("=========TestwithCallable=====");

  • List<Callable<Integer>>callList=newArrayList<Callable<Integer>>();

  • ExecutorServiceexec=Executors.newFixedThreadPool(2);

  • //採用匿名內部類實現

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker1doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做實際工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker2doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做實際工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • exec.invokeAll(callList);

  • exec.shutdown();

  • doSuperWork();

  • }

  • 5、這種過於惡心,只簡單說一下方法,主線程創建一個線程List,將每個子線程保存到列表中,然後定期輪詢列表中子線程狀態,當所有線程都完成之後,再執行主線程邏輯
  • Ⅲ java多線程解決同步問題的幾種方式,原理和代碼

    在Java中一共有四種方法支持同步,其中前三個是同步方法,一個是管道方法。管道方法不建議使用。

    Ⅳ java多線程調用同步方法時,休眠後代碼為什麼執行不到

    1、java多線程調用同步方法時主程序或者後台服務Service程序兩者必須有一個正在運行著,定時任務才會執行。
    2、自動執行的任務可以設置開啟或關閉定時,檢查任務的這一開關處於開啟狀態。
    3、源目錄在定時的時間點如果沒有變化,任務執行後不會留下日誌,通過查看任務的最後執行時間確定任務到底執行了沒有。
    4、執行失敗和沒有執行不是同一回事,如果是執行失敗則要分析失敗原因。這是java多線程調用同步方法時,休眠後代碼執行不到的原因。

    Ⅳ java多線程有幾種實現方法線程之間如何同步

    Java多線程有兩種實現方式:一種是繼承Thread類,另一種是實現Runable介面,大同小異,推薦後者,因為實現介面的話這個類還可以實現別的介面和繼承一個類,靈活性好,若繼承Thread類之後,就無法繼承其他類了。
    至於實現同步,最簡單的方法就是使用同步塊,synchronized(){語句塊}
    當多個線程同時訪問到同步語句塊時,會由一個線程先獲得對象鎖,獲取對象鎖的線程執行完畢之後,釋放鎖,其他線程再次競爭鎖,一個一個通過,不存在兩個以上線程同時執行同步語句塊的情況。

    Ⅵ java語言中線程同步的方法有哪些

    答:wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

    sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。

    notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先順序。

    Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

    Ⅶ Java 線程同步幾種方式

    (1)同步方法:
    即有synchronized關鍵字修飾的方法。 由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。
    (2)同步代碼塊
    即有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
    (3)使用特殊域變數(Volatile)實現線程同步
    a.volatile關鍵字為域變數的訪問提供了一種免鎖機制
    b.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新
    c.因此每次使用該域就要重新計算,而不是使用寄存器中的值
    d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變數
    (4)使用重入鎖實現線程同步
    在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。ReentrantLock類是可重入、互斥、實現了Lock介面的鎖, 它與使用synchronized方法和快具有相同的基本行為和語義,並且擴展了其能力。
    (5)使用局部變數實現線程同步

    Ⅷ Java線程同步的方法

    等待喚醒機制
    wait():讓線程等待。將線程存儲到一個線程池中。
    notify():喚醒被等待的線程。通常都喚醒線程池中的第一個。讓被喚醒的線程處於臨時阻塞狀態。
    notifyAll(): 喚醒所有的等待線程。將線程池中的所有線程都喚醒,讓它們從凍結狀體轉到臨時阻塞狀態.
    這三個方法用於操作線程,可是定義在了Object類中,為什麼呢?
    因為,這三個方法在使用時,都需要定義在同步中,要明確這些方法所操作的線程所屬於鎖。
    簡單說。在A鎖被wait的線程,只能被A鎖的notify方法喚醒。
    所以必須要表示wait notify方法所屬的鎖對象,而鎖對象可以是任意的對象。
    可以被任意的對象調用的方法肯定定義在Object類中。
    注意:等待喚醒機制,通常都用在同步中,因為需要鎖的支持。
    而且必須要明確wait notify 所作用的鎖對象。

    JDK1.5後的鎖

    在jdk1.5版本之後,
    出現了一些新的特性,將原理的線程進行了改良。
    在java.util.concurrent.locks包中提供了一個介面Lock。替代了synchronized。
    synchronized。使用的是鎖操作是隱式的。
    Lock介面,使用的鎖操作是顯示的。
    由兩個方法來完成:
    lock():獲取鎖。
    unlock():釋放鎖。
    還有一個對象,Condition.
    該對象的出現替代了Object中的wait notify notifyAll這些操作監視器的方法。
    替代後的方式:await signal signalAll.

    Ⅸ java 實現線程同步的方式有哪些

    實現同步機制有兩個方法:
    1、同步代碼塊:
    synchronized(同一個數據){} 同一個數據:就是N條線程同時訪問一個數據。
    2、同步方法:
    public synchronized 數據返回類型 方法名(){}
    就是使用 synchronized 來修飾某個方法,則該方法稱為同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的本身(這里指的對象本身有點含糊,其實就是調用該同步方法的對象)通過使用同步方法,可非常方便的將某類變成線程安全的類,具有如下特徵:
    1,該類的對象可以被多個線程安全的訪問。
    2,每個線程調用該對象的任意方法之後,都將得到正確的結果。
    3,每個線程調用該對象的任意方法之後,該對象狀態依然保持合理狀態。
    註:synchronized關鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。
    實現同步機制注意以下幾點: 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。
    1,不要對線程安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。
    2,如果可變類有兩種運行環境,當線程環境和多線程環境則應該為該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.

    Ⅹ java多線程有幾種實現方法

    閱讀全文

    與java多線程同步的方法相關的資料

    熱點內容
    壓縮因子定義 瀏覽:968
    cd命令進不了c盤怎麼辦 瀏覽:214
    葯業公司招程序員嗎 瀏覽:974
    毛選pdf 瀏覽:659
    linuxexecl函數 瀏覽:727
    程序員異地戀結果 瀏覽:374
    剖切的命令 瀏覽:229
    干什麼可以賺錢開我的世界伺服器 瀏覽:290
    php備案號 瀏覽:990
    php視頻水印 瀏覽:167
    怎麼追程序員的女生 瀏覽:487
    空調外壓縮機電容 瀏覽:79
    怎麼將安卓變成win 瀏覽:459
    手機文件管理在哪兒新建文件夾 瀏覽:724
    加密ts視頻怎麼合並 瀏覽:775
    php如何寫app介面 瀏覽:804
    宇宙的琴弦pdf 瀏覽:396
    js項目提成計算器程序員 瀏覽:944
    pdf光子 瀏覽:834
    自拍軟體文件夾名稱大全 瀏覽:328