1. 程式人生 > >Java多執行緒 同步 鎖 條件物件

Java多執行緒 同步 鎖 條件物件

每個程序都有它自己的變數的完備集,執行緒共享相同的資料。---這也是危險之處。

執行緒建立和銷燬的開銷都比程序小。---這是好處。

簡單的,你只要實現Runnable介面,實現過載run()方法,來做自己想做的事情。然後就是開啟一個執行緒,把你實現的類的物件傳入:

Runnable r = new myRunable(args[] a);

Thread t = new Thread(r);

t.start();

這種方法在處理多執行緒時是不建議的。為每一個執行緒做的開銷是值得權衡的代價。<更好的辦法是使用執行緒池>

執行緒的stop方法已經廢棄。現在可以用interrupt方法來中斷一個執行緒的執行。該方法會對執行緒的中斷狀態置位。它是一個布林變數,存在與每個執行緒中。每個執行緒不時地檢查這個標示。while(!Thread.currentThread().isInterrupt()&&.....).儘管如此,如果一個執行緒被阻塞了,它就無法檢查中斷狀態了。這就是產生InterruptedException異常的地方。(interrupted方法會檢查當前執行緒是否中斷,該方法會清除該執行緒的中斷狀態;isInterrupted方法則不會清除……)

執行緒的優先順序:在不同的宿主機上的虛擬機器上,優先順序可能依賴與宿主。所以,不要用執行緒的優先順序依賴關係來作為程式功能的實現。

守護執行緒:唯一的作用就是為其它執行緒提供服務。當虛擬機器中只剩下守護執行緒時,就沒有繼續執行程式的必要了。

通過setUncaughtExceptionHandler方法來為執行緒安裝一個未捕獲異常處理器。這個處理器的目的就是把異常寫入日誌。

執行緒同步:舊版本的JAVA使用Synchronized關鍵字,5.0以後使用ReentrantLock類來實現程式碼的保護。

myLock.lock();// a ReentrantLock object

try

{

critical section;

}

finally

{

myLock.unlock();// make sure the lock is unlocked even if an exception is thrown;

}

通常,一個執行緒進入臨界區,發現它必須要滿足某個條件後才能執行。要使用一個條件物件來管理那些已經獲得鎖,卻不能開始執行有用工作的執行緒。

Condition sufficientFunds = banklock.newCondition();

在發現餘額不足時,呼叫sufficientFunds.await();

這樣,當前執行緒被阻塞,且放棄了鎖。進入等待該條件集中。

當對該賬戶存錢後,需要呼叫sufficientFunds.signalAll();來解除等待執行緒的阻塞狀態。這樣,這些執行緒就可以在當前執行緒退出同步方法後,通過競爭獲得對物件的訪問。

JAVA語言中沒有任何機制來確保死鎖不發生。只能仔細設計自己的程式。

Stop()方法的廢棄:是因為這個方法會終止所有未結束的方法包括run方法。當一個執行緒停止時,它會立即釋放所有鎖住他的物件上的鎖。這會導致物件處於不一致的狀態。

suspend方法的廢棄:是因為它會引起死鎖。(用suspend掛起一個擁有鎖的執行緒,那麼鎖在恢復之前不會被釋放)

相關推薦

Java執行 同步 條件物件

每個程序都有它自己的變數的完備集,執行緒共享相同的資料。---這也是危險之處。執行緒建立和銷燬的開銷都比程序小。---這是好處。簡單的,你只要實現Runnable介面,實現過載run()方法,來做自己想做的事情。然後就是開啟一個執行緒,把你實現的類的物件傳入:Runnable

Java 執行全域性物件

  我們看一個例子: class Demo { public synchronized void test() { System.out.println("test方法開始執行,當前執行緒為:"+Thread.currentThre

Java 執行同步 機制與synchronized

要是很多人在等這把鑰匙,等鑰匙還回來以後,誰會優先得到鑰匙?Not guaranteed。象前面例子裡那個想連續使用兩個上鎖房間的傢伙,他中間還鑰匙的時候如果還有其他人在等鑰匙,那麼沒有任何保證這傢伙能再次拿到。 (JAVA規範在很多地方都明確說明不保證,象Thread.sleep()休息後多久會返回執行,相

java 執行synchronized同步方法,同步程式碼塊

執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部

Java執行程式設計--使用Lock物件實現同步以及執行間通訊

前幾篇: 在《Java多執行緒程式設計-(4)-執行緒間通訊機制的介紹與使用》已經學習了,可以使用方法wait/notify 結合同步關鍵字syn

Java執行--同步與死:synchronized;等待與喚醒:wait、notify、notifyAll;生命週期

class Info{ // 定義資訊類 private String name = "李興華"; // 定義name屬性 private String content = "JAVA講師" ; // 定義content屬性 private boolean flag = false ; // 設

JAVA執行之Synchronized關鍵字--物件的特點

一,介紹 本文介紹JAVA多執行緒中的synchronized關鍵字作為物件鎖的一些知識點。 所謂物件鎖,就是就是synchronized 給某個物件 加鎖。關於 物件鎖 可參考:這篇文章 二,分析 synchronized可以修飾例項方法,如下形式: 1 public class My

java執行-同步函式的

/* 通過分析打印出錯誤票 多執行緒的執行出現了安全問題。 問題的原因: 當多條語句在操作同一個執行緒共享資料時,一個執行緒對多條語句執行了一部分,還沒有執行完 另一個執行緒參與進來執行。導

java執行同步以及執行間通訊詳解&amp;消費者生產者模式&amp;死&amp;Thread.join()(執行程式設計之二)

從執行結果,我們就可以看出我們4個售票視窗同時賣出了1號票,這顯然是不合邏輯的,其實這個問題就是我們前面所說的執行緒同步問題。不同的執行緒都對同一個資料進了操作這就容易導致資料錯亂的問題,也就是執行緒不同步。那麼這個問題該怎麼解決呢?在給出解決思路之前我們先來分析一下這個問題是怎麼產生的?我們宣告一個執行緒類

Java執行-無

1 無鎖類的原理詳解 1.1 CAS CAS演算法的過程是這樣:它包含3個引數CAS(V,E,N)。V表示要更新的變數,E表示預期值,N表示新值。僅當V 值等於E值時,才會將V的值設為N,如果V值和E值不同,則說明已經有其他執行緒做了更新,則當前執行緒什麼 都不做。最後,CAS返

java 執行同步

            執行緒屬性: 1.執行緒優先順序,   優先順序高度依賴於系統,不要讓程式的正確性依賴於優先順序。預設情況子執行緒會繼承父執行緒的優先順序。 2.守護執行緒,   唯一用途是為其他執行緒提供服務,當只剩

java執行機制二

網上看到一個題目,題目是這樣:Java多執行緒,啟動四個執行緒,兩個執行加一,另外兩個執行減一。 針對該問題寫了一個程式,測試通過,如下: class Sync { static int count = 0; public void add() {

java執行機制一

網上看了一篇關於java synchronized關鍵字使用的很好的文章,現將其簡要總結一下,加深理解。 先總結兩個規則: synchronized鎖住的是括號裡的物件,而不是程式碼。對於非static的synchronized方法,鎖的就是物件本身也就是this。 多個執行緒

java 執行 雙重檢查

雙重鎖檢查 public class User { private static User user; public static User getInstance() { if (user == null) { // 1:第一次檢查

Java執行程式設計 — 優化

作者:melonstreet 連結:www.cnblogs.com/QG-whz 閱讀目錄 一、儘量不用:儘量不要鎖住方法 二、減小粒度:縮小同步程式碼塊,只鎖資料 三、避免巢狀:鎖中儘量不要再包含鎖 四、鎖私有化:將鎖私有化,在內部管理鎖 五、適當分解:進行適當的鎖分解

Java執行優化策略

轉載 http://www.cnblogs.com/ygj0930/p/6561264.html 編碼過程中可採取的鎖優化的思路有以下幾種: 1:減少鎖持有時間 例如:對一個方法加鎖,不如對方法中需要同步的幾行程式碼加鎖; 2:減小鎖粒度 例如:

java 執行和valitile關鍵字

死鎖 兩個或者多個執行緒都在等待對方釋放鎖,在寫多執行緒程式碼時要注意避免這種死鎖的發生 發生死鎖後可以在dos命令列輸入jps命令檢視java程序狀況 可以試用jstack -l 程序號   命令檢視當前類的問題 關閉jvm停止死鎖   以上節

Java執行模型-順序與資源

順序鎖:當應用程式使用2把以上的鎖時,就容易出現因為多執行緒獲取鎖的順序不同而死鎖的情形,包括交叉獲取應用程式範圍內的多把已知鎖、交叉獲取應用程式與第三方方法中的多把鎖而造成的順序死鎖。絕大多數死鎖都是因為CPU排程多執行緒時,在執行時序上是交叉進行的而造成亂序獲得多把鎖,從

java執行的分類

轉載:https://blog.csdn.net/nalanmingdian/article/details/77800355 上一篇既然提到了鎖,這一篇來詳細介紹JAVA中的鎖,也為之後JUC下的鎖做一個鋪墊  其實如果按照名稱來說,鎖大概有以下名詞: 自旋鎖 ,自旋鎖的其

java 執行 同步 觀察者 併發集合的一個例子

//第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springfram