導航:首頁 > 編程語言 > java線程中的線程同步

java線程中的線程同步

發布時間:2022-10-21 20:40:13

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類的實例化順序是什麼樣的Java線程同步的方式有哪些

引言:java是在1990年初 ,被詹姆斯•高斯林等人開發的一門面向對象的編程語言。起初,java被稱為0ak,來經過發展0ak改名為java,與1995年的五月份正式向大家發布。

一、java類的實例化順序

java的實例化順序在繼承沒有的情況

單獨一個類的場景下,初始化順序為依次為靜態數據,繼承的基類的構造函數,成員變數,被調用的構造函數。

其中靜態數據只會初始化一次。(靜態數據包括靜態代碼塊和靜態變數,每個類的靜態數據只會初始化一次)

在繼承的情況下

添加兩個基類,讓繼承父親,父親繼承祖父。

繼承的情況就比較復雜了。由繼承了基類,還將往上回溯,遞歸地調用基類的無參構造方法。

在我們的例子中,在初始化靜態數據後,會先往上追溯,調用父的默認構造方法,此時再往上追溯到爺爺的默認構造方法。


無論是java還是什麼別的東西他都體現了現代社會與信息技術的不斷發展,人們在進行進行技術開發時也有了越來越多的方法。程序類的工作也有了更為快捷的方法,這為信息技術的發展也提供了更好的發展方法

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

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

④ java中線程同步的幾種方法

線程同步主要有以下種方法(示例中是實現計數的功能):

1、同步方法,即使用synchronized關鍵字修飾方法,例如:

publicsynchronizedvoidadd(intc){...}

2、同步代碼塊,即有synchronized關鍵字修飾的語句塊,例如:

publicvoidaddAndGet(intc){
synchronized(this){
count+=c;
}
}

3、使用特殊域變數(volatile)實現線程同步,該方法不能保證絕對的同步。

例如:privatevolatileintcount=0;

4、使用鎖實現線程同步,例如:

privateLocklock=newReentrantLock();
publicvoidadd(intc){
lock.lock();//上鎖
try{
count+=c;
}finally{
lock.unlock();//解鎖
}
}

5、使用原子變數實現線程同步,在java的util.concurrent.atomic包中提供了創建了原子類型變數的工具類,例如:

privateAtomicIntegercount=newAtomicInteger(1);
publicvoidadd(intc){
count.addAndGet(c);
}

6、使用局部變數實現線程同步,如果使用ThreadLocal管理變數,則每一個使用該變數的線程都獲得該變數的副本, 副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變數副本,而不會對其他線程產生影響。

ThreadLocal 類的常用方法

new ThreadLocal<T>() : 創建一個線程本地變數

get() : 返回此線程局部變數的當前線程副本中的值

initialValue() : 返回此線程局部變數的當前線程的"初始值"

set(T value) : 將此線程局部變數的當前線程副本中的值設置為value

示例代碼:

privatestaticThreadLocal<Integer>count=newThreadLocal<Integer>(){
@Override
protectedIntegerinitialValue(){
return1;
}
};

publicvoidadd(intc){
count.set(count.get()+c);
}

7、使用阻塞隊列實現,例如LinkedBlockingQueue,具體使用可網路LinkedBlockingQueue的用法或查看java文檔。

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

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

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

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

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

⑥ 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線程同步的方法

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

    ⑨ Java線程同步,是什麼意思

    一種是方法前加sychronized
    public void sychronized start() {
    System.out.println("start");
    }

    另一種是在代碼段之前加sychronized
    (sychronized){
    。。。。。
    }

    同步方法(synchronized關鍵字修飾的方法)可以較好地解決並發問題,在一定程度上可以避免出現資源搶占、競爭條件和死鎖的情況,但其副作用是同步鎖可導致線程阻塞。這要求同步方法的執行時間不能太長。

    這就是所謂的鎖機制,你何以使用sychronized(Object obj)鎖住某個對象,等你使用完這個對象之後,再進行鎖的釋放,其他需要該對象的線程才可以執行。

    閱讀全文

    與java線程中的線程同步相關的資料

    熱點內容
    皓強工具解壓步驟 瀏覽:690
    部隊抗洪搶險命令範文 瀏覽:888
    歐姆龍plc編程軟體使用教程 瀏覽:594
    ai文件pdf 瀏覽:911
    騰訊雲伺服器掛載混合雲 瀏覽:758
    智能小車用什麼單片機 瀏覽:463
    java怎麼給窗口關閉 瀏覽:940
    列舉51單片機的定址方式 瀏覽:706
    剪輯app怎麼寫長篇文字 瀏覽:400
    app專屬流量過月租怎麼不更新 瀏覽:654
    王者程序員都有誰 瀏覽:76
    給牛換腳掌解壓 瀏覽:387
    圍棋有多少種演算法 瀏覽:602
    unity資源包在哪個文件夾 瀏覽:704
    阿里雲伺服器遠程鏈接不成功 瀏覽:482
    文件系統pdf 瀏覽:767
    原神安卓區服什麼意思 瀏覽:38
    貝殼app怎麼線上發布 瀏覽:161
    如何挑選安卓系統機頂盒 瀏覽:55
    安卓快充使用有什麼注意事項 瀏覽:911