摘要:提供了多線程升級方案將同步替換成了顯示的操作。線程間通信接口可以替代傳統的線程間通信,用替換,用替換,用替換。商品執行上述代碼,觀察結果可以看到,多個線程同時生產消費,由于指定喚醒互異線程,因此并不會引起錯誤。
JDK 1.5提供了多線程升級方案
將同步synchronized替換成了顯示的Lock操作??梢詫崿F喚醒、凍結指定的線程。
Lock接口
Lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支持多個相關的 Condition 對象。
線程間通信Condition接口
Condition可以替代傳統的線程間通信,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll()。該對象可以通過Lock鎖進行獲取。
傳統線程的通信方式,Condition都可以實現。
注意,Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用newCondition()方法。
ReentrantLock類
Java.util.concurrent.lock 中的Lock 框架是鎖定的一個抽象,它允許把鎖定的實現作為 Java 類,而不是作為語言的特性來實現。這就為Lock 的多種實現留下了空間,各種實現可能有不同的調度算法、性能特性或者鎖定語義。
ReentrantLock 類實現了Lock ,它擁有與synchronized 相同的并發性和內存語義,但是添加了類似鎖投票、定時鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭用情況下更佳的性能。(換句話說,當許多線程都想訪問共享資源時,JVM 可以花更少的時候來調度線程,把更多時間用在執行線程上。)
用法示例:
private Lock lock = new ReentrantLock();//定義多態ReentrantLock類對象 private Condition cond_pro = lock.newCondition();//Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用Lock對象的newCondition()方法。 private Condition cond_con = lock.newCondition();//一個lock可以有多個相關的condition
首先創建一個ReentrantLock類的多態對象,即建立一把鎖。然后將這把鎖與兩個Condition對象關聯。
實例:
import java.util.concurrent.locks.*; class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r);//生產者對象 Consumer con = new Consumer(r);//消費者對象 Thread t1 = new Thread(pro); Thread t2 = new Thread(pro); Thread t3 = new Thread(con); Thread t4 = new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); } } class Resource { private String name; private int count = 1; private boolean flag = false; private Lock lock = new ReentrantLock();//定義一個實現Lock接口的ReentrantLock類對象 private Condition cond_pro = lock.newCondition();//Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用Lock對象的newCondition()方法。 private Condition cond_con = lock.newCondition();//一個lock可以有多個相關的condition public void set(String name) throws InterruptedException//生產方法 //注意這里拋出await()方法異常聲明,交給調用者處理 { lock.lock(); //手動加同步鎖 try { while (flag) //if→while 此時若生產完一個以后喚醒了另一個生產者,則再次判斷,避免了兩個生產者同時生產 cond_pro.await(); //凍結生產方法 this.name = name+"____"+count++; System.out.println(Thread.currentThread().getName()+"_______"+"生產者"+this.name); flag = true; cond_con.signal(); //喚醒消費方法,利用了condition的signal()指定喚醒對象 } finally // { lock.unlock(); } } public void out()throws InterruptedException { lock.lock(); try { while (!flag) cond_con.await(); System.out.println(Thread.currentThread().getName()+"______"+"消費者"+this.name); flag = false; cond_pro.signal(); } finally //釋放鎖必須得到執行 { lock.unlock(); } } } class Consumer implements Runnable { private Resource res; public Consumer(Resource res) { this.res = res; } public void run() { while (true) { try //由于out()方法拋出了異常聲明,這里必須捕獲。 { res.out(); } catch (InterruptedException e) { } } } } class Producer implements Runnable { private Resource res; public Producer(Resource res) { this.res = res; } public void run() { while (true) { try { res.set("+商品+"); } catch (InterruptedException e) { } } } }
執行上述代碼,觀察結果:
可以看到,多個線程同時生產、消費,由于指定喚醒互異線程,因此并不會引起錯誤。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69842.html
摘要:線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。在的線程中并沒有可供任何對象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發編程網 - 鄭旭東 校對:方騰飛 多...
摘要:多線程和并發問題是技術面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。 多線程和并發問題是 Java 技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多線程基礎知識來對應日后碰到的問題。(...
摘要:本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,的使用,定時器,單例模式,以及線程狀態與線程組。源碼采用構建,多線程這部分源碼位于模塊中。通知可能等待該對象的對象鎖的其他線程。 本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,lock的使用,定時器,單例模式,以及線程狀態與線程組。 寫在前面 花了一周時...
摘要:程序執行時,至少會有一個線程在運行,這個運行的線程被稱為主線程。程序的終止是指除守護線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實際上跟蹤的是線程的執行。 單線程程序 在單線程程序中,在某個時間點執行的處理只有一個。 Java 程序執行時,至少會有一個線程在運行...
摘要:前文回顧上一篇文章重點嘮叨了中協調線程間通信的機制,它有力的保證了線程間通信的安全性以及便利性。所以同一時刻廚師線程和服務員線程不會同時在等待隊列中。對于在操作系統中線程的阻塞狀態,語言中用和這三個狀態分別表示。 前文回顧 上一篇文章重點嘮叨了java中協調線程間通信的wait/notify機制,它有力的保證了線程間通信的安全性以及便利性。本篇將介紹wait/notify機制的一個應用...
閱讀 2486·2021-11-15 18:14
閱讀 1711·2021-10-14 09:42
閱讀 3746·2021-10-11 10:58
閱讀 3938·2021-10-09 09:44
閱讀 2410·2021-09-26 09:55
閱讀 2430·2021-09-24 10:38
閱讀 2025·2021-09-04 16:48
閱讀 3268·2021-09-02 15:21