J U C系列(整體架構)

2021-08-28 10:18:16 字數 4362 閱讀 9033

executors是乙個執行緒池工具類
包含以下幾個靜態方法

a.newsinglethreadexecutor
單個執行緒的執行緒池。

b.newcachedthreadpool
這是乙個可快取的執行緒池,如果沒有執行緒池中沒有執行緒則自動建立。

c.newfixedthreadpool
固定長度的執行緒池。

d.newworkstealingpool
使用synchronousqueue阻塞佇列的執行緒池。

這裡只介紹單槽交換,此類主要使用者兩個執行緒用來交換物件,例如:乙個工廠執行緒負責生產物件(生產比較耗費資源),乙個執行緒負責消費,將生產的物件傳給此執行緒消費。只能用來兩個執行緒交換,不能指定執行緒。

public class gradletest  catch (interruptedexception e) 

};static final runnable run2 = ()-> catch (interruptedexception e)

countdownlatch.countdown();

};static final runnable run3 = ()-> catch (interruptedexception e)

countdownlatch.countdown();

};static final runnable run4 = ()-> catch (interruptedexception e)

countdownlatch.countdown();

};@test

public void testexchanger() catch (interruptedexception e)

}

semaphore經常用於限制獲取某種資源的執行緒數量。

下面**我們看到,同時有5個執行緒申請兩個工具,所以我們必須限制執行緒申請。當2個執行緒已經申請到工具

semaphore.acquire()
其他執行緒處於等待狀態,等待使用工具的執行緒釋放工具

semaphore.release(1)
public class semaphoretest ;

static executorservice executorservice = executors.newcachedthreadpool();

static final countdownlatch countdownlatch = new countdownlatch(5);

static final runnable fix1 = () -> catch (interruptedexception e) finally

};static tools getunusedtools()

}return null;

}static void realsetools(tools tools)

@test

public void testsemaphore() catch (interruptedexception e) }}

cyclicbarrier為執行緒設立屏障,當所有執行緒到達屏障時才繼續往下執行操作。
public class cyclicbarriertest ;

在jdk5.0以前reentrantlock的效能優於synchronized,但是在jdk6.0以後的版本兩者的效能相差無幾。reentrantlock提供了比synchronized能加靈活的操作方式。

public class reentrantlocktest  catch (interruptedexception e) finally 

};@test

public void testreentrantlock() catch (interruptedexception e) }}

condition是在jdk5.0之後才出現,他是用來替代傳統的synchronized加object的wait()和notify()方法的。

public class conditiontest 

if (hadproductnum == maxnum)

int product = factory.incrementandget();

container.addlast(product);

system.out.println(thread.currentthread().getname() + " 生成 " + product);

hadproductnum++;

empty.signal();

} catch (interruptedexception e) finally }}

}static class consumer implements runnable

//容器沒有資料則休息一會

if (container.isempty())

integer product = container.removefirst();

system.out.println(thread.currentthread().getname() + " 消費" + product);

hadconsumenum++;

full.signal();

} catch (interruptedexception e) finally }}

}@test

public void testcondition()catch(exception e)

system.out.println(" 完成. ");}}

reentrantreadwritelock是da有reentrantlock語義的讀寫鎖

(a).重入方面其內部的writelock可以獲取readlock,但是反過來readlock想要獲得writelock則永遠都不要想。 

(b).writelock可以降級為readlock,順序是:先獲得writelock再獲得readlock,然後釋放writelock,這時候執行緒將保持readlock的持有。反過來readlock想要公升級為writelock則不可能,為什麼?參看(a),呵呵. 

(c).readlock可以被多個執行緒持有並且在作用時排斥任何的writelock,而writelock則是完全的互斥。這一特性最為重要,因為對於高讀取頻率而相對較低寫入的資料結構,使用此類鎖同步機制則可以提高併發量。 

(d).不管是readlock還是writelock都支援interrupt,語義與reentrantlock一致。 

(e).writelock支援condition並且與reentrantlock語義一致,而readlock則不能使用condition,否則丟擲unsupportedoperationexception異常。

locksupport提供park()和unpark()方法實現阻塞執行緒和解除執行緒阻塞,實現的阻塞和解除阻塞是基於」許可(permit)」作為關聯,permit相當於乙個訊號量(0,1),預設是0. 執行緒之間不再需要乙個object或者其它變數來儲存狀態,不再需要關心對方的狀態.

Spark系列 四 整體架構分析

架構流程圖 說明 driver端流程說明 standalone模式 通過反射的方式建立和構造乙個driveractor程序 driver程序 sparkcontext初始化,構造dagscheduler和taskscheduler.每執行到乙個action操作就會建立乙個job,該job會提交到da...

ODI 系列學習 整體架構概念

odi整體架構沒有oracle database複雜,因為它屬於程式功能的使用,更多是程式開發和配置的工作,當然odi的優化涉及到很多資料庫優化的工作,從整體架構入手,基礎有了,整體把握就會簡單很多。首先理解odi元件的幾個組成部分 odi資料庫,最後看元件與資料庫的關係。odi是乙個資料整合的平台...

ODI 系列學習 整體架構概念

odi整體架構沒有oracle database複雜,因為它屬於程式功能的使用,更多是程式開發和配置的工作,當然odi的優化涉及到很多資料庫優化的工作,從整體架構入手,基礎有了,整體把握就會簡單很多。首先理解odi元件的幾個組成部分 odi資料庫,最後看元件與資料庫的關係。odi是乙個資料整合的平台...