當前位置:首頁 » 編程語言 » java多線程的同步

java多線程的同步

發布時間: 2025-02-13 22:46:15

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

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

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

java中多線程的實現方法有兩種:1.直接繼承thread類;2.實現runnable介面;同步的實現方法有五種:1.同步方法;2.同步代碼塊;3.使用特殊域變數(volatile)實現線程同步;4.使用重入鎖實現線程同步;5.使用局部變數實現線程同步 。
其中多線程實現過程中需注意重寫或者覆蓋run()方法,而對於同步的實現方法中使用較常使用的是利用synchronized編寫同步方法和代碼塊。

❸ java多線程中synchronized關鍵字的用法

由於同一進程內的多個線程共享內存空間 在Java中 就是共享實例 當多個線程試圖同時修改某個實例的內容時 就會造成沖突 因此 線程必須實現共享互斥 使多線程同步

最簡單的同步是將一個方法標記為synchronized 對同一個實例來說 任一時刻只能有一個synchronized方法在執行 當一個方法正在執行某個synchronized方法時 其他線程如果想要執行這個實例的任意一個synchronized方法 都必須等待當前執行 synchronized方法的線程退出此方法後 才能依次執行

但是 非synchronized方法不受影響 不管當前有沒有執行synchronized方法 非synchronized方法都可以被多個線程同時執行

此外 必須注意 只有同一實例的synchronized方法同一時間只能被一個線程執行 不同實例的synchronized方法是可以並發的 例如 class A定義了synchronized方法sync() 則不同實例a sync()和a sync()可以同時由兩個線程來執行

多線程同步的實現最終依賴鎖機制 我們可以想像某一共享資源是一間屋子 每個人都是一個線程 當A希望進入房間時 他必須獲得門鎖 一旦A獲得門鎖 他進去後就立刻將門鎖上 於是B C D就不得不在門外等待 直到A釋放鎖出來後 B C D中的某一人搶到了該鎖(具體搶法依賴於 JVM的實現 可以先到先得 也可以隨機挑選) 然後進屋又將門鎖上 這樣 任一時刻最多有一人在屋內(使用共享資源)

Java語言規范內置了對多線程的支持 對於Java程序來說 每一個對象實例都有一把 鎖 一旦某個線程獲得了該鎖 別的線程如果希望獲得該鎖 只能等待這個線程釋放鎖之後 獲得鎖的方法只有一個 就是synchronized關鍵字 例如

public class SharedResource {

private int count = ;

public int getCount() { return count; }

public synchronized void setCount(int count) { unt = count; }

}

同步方法public synchronized void setCount(int count) { unt = count; } 事實上相當於

public void setCount(int count) {

synchronized(this) { // 在此獲得this鎖

unt = count;

} // 在此釋放this鎖

}

紅色部分表示需要同步的代碼段 該區域為 危險區域 如果兩個以上的線程同時執行 會引發沖突 因此 要更改SharedResource的內部狀態 必須先獲得SharedResource實例的鎖

退出synchronized塊時 線程擁有的鎖自動釋放 於是 別的線程又可以獲取該鎖了

為了提高性能 不一定要鎖定this 例如 SharedResource有兩個獨立變化的變數

public class SharedResouce {

private int a = ;

private int b = ;

public synchronized void setA(int a) { this a = a; }

public synchronized void setB(int b) { this b = b; }

}

若同步整個方法 則setA()的時候無法setB() setB()時無法setA() 為了提高性能 可以使用不同對象的鎖

public class SharedResouce {

private int a = ;

private int b = ;

private Object sync_a = new Object()

private Object sync_b = new Object()

public void setA(int a) {

synchronized(sync_a) {

this a = a;

}

}

public synchronized void setB(int b) {

synchronized(sync_b) {

this b = b;

}

lishixin/Article/program/Java/gj/201311/27512

❹ java多線程開發的同步機制有哪些

一段synchronized的代碼被一個線程執行之前,他要先拿到執行這段代碼的許可權,在 java里邊就是拿到某個同步對象的鎖(一個對象只有一把鎖); 如果這個時候同步對象的鎖被其他線程拿走了,他(這個線程)就只能等了(線程阻塞在鎖池 等待隊列中)。 取到鎖後,他就開始執行同步代碼(被synchronized修飾的代碼);線程執行完同步代碼後馬上就把鎖還給同步對象,其他在鎖池中 等待的某個線程就可以拿到鎖執行同步代碼了。這樣就保證了同步代碼在統一時刻只有一個線程在執行。
眾所周知,在Java多線程編程中,一個非常重要的方面就是線程的同步問題。
關於線程的同步,一般有以下解決方法:

1. 在需要同步的方法的方法簽名中加入synchronized關鍵字。

2. 使用synchronized塊對需要進行同步的代碼段進行同步。

3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock對象。

另外,為了解決多個線程對同一變數進行訪問時可能發生的安全性問題,我們不僅可以採用同步機制,更可以通過JDK 1.2中加入的ThreadLocal來保證更好的並發性。

熱點內容
eclipseandroid運行 發布:2025-02-14 00:54:57 瀏覽:897
雲伺服器安全策略 發布:2025-02-14 00:54:07 瀏覽:289
小米手機如何更改賬號密碼 發布:2025-02-14 00:48:48 瀏覽:572
我的世界如何導出伺服器 發布:2025-02-14 00:48:39 瀏覽:722
工業伺服器機箱怎麼樣 發布:2025-02-14 00:29:15 瀏覽:86
英朗壓縮機 發布:2025-02-14 00:29:12 瀏覽:678
java門面模式 發布:2025-02-14 00:29:09 瀏覽:917
java旋轉 發布:2025-02-14 00:22:49 瀏覽:104
存儲虛擬化方案 發布:2025-02-14 00:21:15 瀏覽:696
ubuntupython3安裝 發布:2025-02-14 00:14:45 瀏覽:662