欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java并發(fā)編程之同步器代碼示例

 更新時間:2017年11月21日 08:46:35   作者:Blessing_H  
這篇文章主要介紹了java并發(fā)編程之同步器代碼示例,分享了相關(guān)代碼,具有一定參考價值,需要的朋友可以了解下。

同步器是一些使線程能夠等待另一個線程的對象,允許它們協(xié)調(diào)動作。最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier和Exchanger

隊列同步器AbstractQueuedSynchronizer是用來構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架,它內(nèi)部使用了一個volatiole修飾的int類型的成員變量state來表示同步狀態(tài),通過內(nèi)置的FIFO隊列來完成資源獲取線程的排隊工作。

同步器的主要使用方式是繼承,子類通過繼承同步器并實現(xiàn)它的抽象方法來管理同步狀態(tài),在抽象方法的實現(xiàn)過程中免不了要對同步狀態(tài)進行修改,這時就需要使用同步器來提供的3個方法(getState()、setState(intnewState)/和compareAndSetState(intexpect,intupdate))來進行操作,因為他們能夠保證狀態(tài)的改變是安全的。子類推薦被定義為自定義同步組件的靜態(tài)內(nèi)部類,同步器自身沒有實現(xiàn)任何同步接口,它僅僅是定義了若干同步狀態(tài)獲取個釋放的方法來供自定義同步組件使用,同步器既可以獨占式的獲取同步狀態(tài),也可以支持共享式的獲取同步狀態(tài),這樣就可以方便實現(xiàn)不同類型的同步組件(ReentrantLock、ReadWriteLock、和CountDownLatch等)。

同步器是實現(xiàn)鎖的關(guān)鍵,在鎖的實現(xiàn)中聚合同步器,利用同步器實現(xiàn)鎖的語義。他們二者直接的關(guān)系就是:鎖是面向使用者的,它定義了使用者與鎖交互的接口,隱藏了實現(xiàn)的細節(jié);同步器則是面向鎖的實現(xiàn)者,它簡化了鎖的實現(xiàn)方式,屏蔽了同步狀態(tài)管理、線程的排隊、等待與喚醒等底層操作。鎖和同步器很好的隔離了使用者與實現(xiàn)者所需關(guān)注的領(lǐng)域。

同步器的設(shè)計是基于模版方法模式實現(xiàn)的,使用者需要繼承同步器并重寫這頂?shù)姆椒?,隨后將同步器組合在自定義同步組件的實現(xiàn)中,并調(diào)用同步器提供的模版方法,而這些模版方法將會調(diào)用使用者重寫的方法。

同步器提供的模版方法基本上分為3類:獨占式獲取鎖與釋放同步狀態(tài)、共享式獲取與釋放同步狀態(tài)和查詢同步隊列中的等待線程情況。自定義同步組件將使用同步器提供的模版方法來實現(xiàn)自己的同步語義。倒計數(shù)器鎖存器是一次性障礙,允許一個或者多個線程等待一個或者多個其它線程來做某些事情。CountDownLatch的唯一構(gòu)造器帶一個int類型的參數(shù),這個int參數(shù)是指允許所有在等待線程被處理之前,必須在鎖存器上調(diào)用countDown方法的次數(shù)。

EG:

package hb.java.thread;
import java.util.concurrent.CountDownLatch;
/**
 * 
 * @author hb
 *     CountDownLatch最重要的方法是countDown()和await(),前者主要是倒數(shù)一次,后者是等待倒數(shù)到0,如果沒有到達0
 *     ,就只有阻塞等待了。 *JAVA同步器之
 *     CountDownLatch(不能循環(huán)使用,如果需要循環(huán)使用可以考慮使用CyclicBarrier) 兩種比較常規(guī)用法: 1:new
 *     CountDownLatch(1);所有的線程在開始工作前需要做一些準(zhǔn)備工作,當(dāng)所有的線程都準(zhǔn)備到位后再統(tǒng)一執(zhí)行時有用 2:new
 *     CountDownLatch(THREAD_COUNT);當(dāng)所有的線程都執(zhí)行完畢后,等待這些線程的其他線程才開始繼續(xù)執(zhí)行時有用
 */
public class CountDownLatchTest {
	private static final int THREAD_COUNT = 10;
	// 在調(diào)用startSingal.countDown()之前調(diào)用了startSingal.await()的線程一律等待,直到startSingal.countDown()的調(diào)用
	private static final CountDownLatch startSingal = new CountDownLatch(1);
	// 在finishedSingal的初始化記數(shù)量通過調(diào)用finishedSingal.countDown()減少為0時調(diào)用了finishedSingal.await()的線程一直阻塞
	private static final CountDownLatch finishedSingal = new CountDownLatch(
				THREAD_COUNT);
	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < THREAD_COUNT; i++) {
			new Thread("Task " + i) {
				public void run() {
					System.out.println(Thread.currentThread().getName()
												+ " prepared!!");
					try {
						startSingal.await();
					}
					catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
												+ " finished!!");
					finishedSingal.countDown();
				}
				;
			}
			.start();
		}
		Thread.sleep(1000);
		startSingal.countDown();
		// 所有的線程被喚醒,同時開始工作.countDown 方法的線程等到計數(shù)到達零時才繼續(xù)
		finishedSingal.await();
		// 等待所有的線程完成!!
		System.out.println("All task are finished!!");
	}
}
package hb.java.thread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/** 
 * 
 * JAVA同步器之Barrier(能夠循環(huán)使用,當(dāng)計數(shù)器增加到Barrier的初始化計數(shù)器之后馬上會被置為0為下一次循環(huán)使用做準(zhǔn)備) 
 * Barrier能夠為指定的一個或多個(一般為多個)線程設(shè)置一道屏障,只有當(dāng)所有的線程都到達該屏障后才能一起沖過該屏障繼續(xù)其他任務(wù) 一般可以new 
 * CyclicBarrier(ThreadCount)來進行初始化,也可以new 
 * CyclicBarrier(ThreadCount,RunableAction)當(dāng)初始化數(shù)量的線程都調(diào)用 
 * 了await()方法后觸發(fā)RunableAction線程,也可以通過初始化一個new 
 * CyclicBarrier(ThreadCount+1)的Barrier在前置線程未執(zhí)行完成時一直阻塞一個或多個 
 * 后續(xù)線程,這一點類似于CountDownLatch 
 */
public class BarrierTest {
	private static final int THREAD_COUNT = 10;
	private static final CyclicBarrier barrier = new CyclicBarrier( 
	      THREAD_COUNT + 1, new Runnable() {
		@Override 
		        public void run() {
			System.out.println("All task are prepared or finished!!");
		}
	}
	);
	public static void main(String[] args) throws InterruptedException, 
	      BrokenBarrierException {
		for (int i = 0; i < THREAD_COUNT; i++) {
			new Thread("Task " + i) {
				public void run() {
					try {
						System.out.println(Thread.currentThread().getName() 
						                + " prepared!!");
						barrier.await();
					}
					catch (InterruptedException e) {
						// TODO Auto-generated catch block 
						e.printStackTrace();
					}
					catch (BrokenBarrierException e) {
						// TODO Auto-generated catch block 
						e.printStackTrace();
					}
					// do something 
					System.out.println(Thread.currentThread().getName() 
					              + " finished!!");
				}
				;
			}
			.start();
		}
		barrier.await();
		// --------------開始準(zhǔn)備循環(huán)使用-------------- 
		for (int i = 0; i < THREAD_COUNT; i++) {
			new Thread("Task " + i) {
				public void run() {
					// do something 
					System.out.println(Thread.currentThread().getName() 
					              + " finished!!");
					try {
						barrier.await();
					}
					catch (InterruptedException e) {
						// TODO Auto-generated catch block 
						e.printStackTrace();
					}
					catch (BrokenBarrierException e) {
						// TODO Auto-generated catch block 
						e.printStackTrace();
					}
				}
				;
			}
			.start();
		}
		barrier.await();
	}
}
package hb.java.thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger;
public class ExchangerTest {
	final static Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
	public static void main(String[] args) {
		new Producer("Producer", exchanger).start();
		new Consumer("Consumer", exchanger).start();
	}
	static class Producer extends Thread {
		private Exchanger<List<String>> exchanger;
		/** 
     *  
     */
		public Producer(String threadName, Exchanger<List<String>> exchanger) {
			super(threadName);
			this.exchanger = exchanger;
		}
		/* 
     * (non-Javadoc) 
     * 
     * @see java.lang.Thread#run() 
     */
		@Override 
		    public void run() {
			List<String> products = new ArrayList<String>();
			for (int i = 0; i < 10; i++) {
				products.add("product " + i);
			}
			try {
				List<String> results = exchanger.exchange(products);
				System.out.println("get results from consumer");
				for (String s : results) {
					System.out.println(s);
				}
			}
			catch (InterruptedException e) {
				// TODO Auto-generated catch block 
				e.printStackTrace();
			}
		}
	}
	static class Consumer extends Thread {
		private Exchanger<List<String>> exchanger;
		/** 
     *  
     */
		public Consumer(String threadName, Exchanger<List<String>> exchanger) {
			super(threadName);
			this.exchanger = exchanger;
		}
		/* 
     * (non-Javadoc) 
     * 
     * @see java.lang.Thread#run() 
     */
		@Override 
		    public void run() {
			List<String> products = new ArrayList<String>();
			for (int i = 0; i < 10; i++) {
				products.add("consumed " + i);
			}
			try {
				List<String> results = exchanger.exchange(products);
				System.out.println("got products from produces");
				for (String s : results) {
					System.out.println(s);
				}
			}
			catch (InterruptedException e) {
				// TODO Auto-generated catch block 
				e.printStackTrace();
			}
		}
	}
}

總結(jié)

以上就是本文關(guān)于java并發(fā)編程之同步器代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

深入分析java并發(fā)編程中volatile的實現(xiàn)原理

Javaweb應(yīng)用使用限流處理大量的并發(fā)請求詳解

java并發(fā)學(xué)習(xí)之BlockingQueue實現(xiàn)生產(chǎn)者消費者詳解

如有不足之處,歡迎留言指出。

相關(guān)文章

  • Mybatis 中的insertOrUpdate操作

    Mybatis 中的insertOrUpdate操作

    這篇文章主要介紹了Mybatis 中的insertOrUpdate操作,代碼簡單易懂,非常不錯需要的的朋友參考下
    2016-12-12
  • 詳解Spring?Bean的集合注入和自動裝配

    詳解Spring?Bean的集合注入和自動裝配

    這篇文章主要為大家詳細介紹了Spring?Bean中集合注入和自動裝配的方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-06-06
  • java實現(xiàn)超市管理系統(tǒng)

    java實現(xiàn)超市管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • java郵件收發(fā)功能實現(xiàn)代碼

    java郵件收發(fā)功能實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了java郵件收發(fā)功能實現(xiàn)代碼,具有一定的參考價值,感興趣的朋友可以參考一下
    2016-06-06
  • Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程

    Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程

    本文詳細講解了Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java調(diào)用IK分詞器進行分詞方式,封裝工具類

    Java調(diào)用IK分詞器進行分詞方式,封裝工具類

    這篇文章主要介紹了Java調(diào)用IK分詞器進行分詞方式,封裝工具類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中@valid和@Validated注解的使用詳解

    Java中@valid和@Validated注解的使用詳解

    這篇文章主要介紹了Java中@valid和@Validated注解的使用詳解,@Validated可以用在類型、方法和方法參數(shù)上,但是不能用在成員屬性(字段)上,不支持嵌套檢測,@Valid可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上,支持嵌套檢測,需要的朋友可以參考下
    2024-01-01
  • Spring IOC (DI) 依賴注入的四種方式示例詳解

    Spring IOC (DI) 依賴注入的四種方式示例詳解

    這篇文章主要介紹了Spring IOC (DI) 依賴注入的四種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot整合activemq的案例代碼

    SpringBoot整合activemq的案例代碼

    ActiveMQ是消息隊列技術(shù),為解決高并發(fā)問題而生,本文通過案例代碼給大家介紹pringBoot整合activemq的詳細過程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java正則表達式匹配電話格式

    Java正則表達式匹配電話格式

    正則表達式是由普通的字符以及特殊字符組成的文字模式,用來在查找文字主體時待匹配的一個或多個字符串。本文給大家介紹java正則表達式匹配電話格式,對java正則表達式匹配相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11

最新評論