併發編程-深入淺出AQS

AQS是併發編程中非常重要的概念,它是juc包下的許多併發工具類,如CountdownLatch,CyclicBarrier,Semaphore 和鎖, 如ReentrantLock, ReaderWriterLock的實現基礎,提供了一個基於int狀態碼和隊列來實現的併發框架。本文將對AQS框架的幾個重要組成進行簡要介紹,讀完本文你將get到以下幾個點:

  1. AQS進行併發控制的機制是什麼

  2. AQS獨佔和共享模式是如何實現的

  3. 同步隊列和條件等待隊列的區別,和數據出入隊原則

一,AQS基本概念

AQS(AbstractQueuedSynchronizer)是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量來表示狀態,通過內置的FIFO(first in,first out)隊列來完成資源獲取線程的排隊工作。

隊列可分為兩種,一種是同步隊列,是程序執行入口出處的等待隊列;而另一種則是條件等待隊列,隊列中的元素是在程序執行時在某個條件上發生等待。

1.1 獨佔or共享模式

AQS支持兩種獲取同步狀態的模式既獨佔式和共享式。顧名思義,獨佔式模式同一時刻只允許一個線程獲取同步狀態,而共享模式則允許多個線程同時獲取。

1.2 同步隊列

當一個線程嘗試獲取同步狀態失敗時,同步器會將這個線程以及等待狀態等信息構造成一個節點加入到等待隊列中,同時會阻塞當前線程,當同步狀態釋放時,會把首節點中的線程喚醒,使其再次嘗試重複獲取同步隊列。

1.3 條件隊列

AQS內部類ConditionObject來實現的條件隊列,當一個線程獲取到同步狀態,但是卻通過Condition調用了await相關的方法時,會將該線程封裝成Node節點並加入到條件隊列中,它的結構和同步隊列相同。

二,獨佔or共享模式

AQS框架中,通過維護一個int類型的狀態,來進行併發控制,線程通常通過修改此狀態信息來表明當前線程持有此同步狀態。AQS則是通過保存修改狀態線程的引用來實現獨佔和共享模式的。

/**
 * 獲取同步狀態
 */
public final void acquire(int arg) {
    //嘗試獲取同步狀態, 如果嘗試獲取到同步狀態失敗,則加入到同步隊列中
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}
/**
 * 嘗試獲取同步狀態【子類中實現】,因為aqs基於模板模式,僅提供基於狀態和同步隊列的實 
 * 現思路,具體的實現由子類決定
 */
protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        // 如果當前狀態值為0,並且等待隊列中沒有元素,執行修改狀態值操作
        if (!hasQueuedPredecessors() &&
            compareAndSetState(0, acquires)) {
            // 修改狀態值成功,記錄當前持有同步狀態的線程信息
            setExclusiveOwnerThread(current);
            return true;
        }
        // 如果當前線程已經持有同步狀態,繼續修改同步狀態【重入鎖實現原理】
    } else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

/**
 * 根據傳入的模式以及當前線程信息創建一個隊列的節點並加入到同步隊列尾部
 */
private Node addWaiter(Node mode) {
    Node node = new Node(Thread.currentThread(), mode);
    // Try the fast path of enq; backup to full enq on failure
    Node pred = tail;
    if (pred != null) {
        node.prev = pred;
        if (compareAndSetTail(pred, node)) {
            pred.next = node;
            return node;
        }
    }
    enq(node);
    return node;
}
/**
 * 同步隊列中節點,嘗試獲取同步狀態
 */
final boolean acquireQueued(final Node node, int arg) {
    boolean failed = true;
    try {
        boolean interrupted = false;
        // 自旋(死循環)
        for (;;) {
            // 只有當前節點的前驅節點是頭節點時才會嘗試執行獲取同步狀態操作
            final Node p = node.predecessor();
            if (p == head && tryAcquire(arg)) {
                setHead(node);
                p.next = null; // help GC
                failed = false;
                return interrupted;
            }
            if (shouldParkAfterFailedAcquire(p, node) &&
                parkAndCheckInterrupt())
                interrupted = true;
        }
    } finally {
        if (failed)
            cancelAcquire(node);
    }
}

獨佔式是如何控製得?

當修改狀態信息成功后,如果執行的是獨佔式操作,AQS的具體實現類中會保存當前線程的信息來聲明同步狀態已被當前線程佔用,此時其他線程再嘗試獲取同步狀態會返回false。

三,同步隊列

3.1 隊列中保存那些信息?

同步隊列節點中主要保存着線程的信息以及模式(共享or獨佔)。

3.2 何時執行入隊操作?

/**
 * 獲取同步狀態
 */
public final void acquire(int arg) {
    //嘗試獲取同步狀態, 如果嘗試獲取到同步狀態失敗,則加入到同步隊列中
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

復用上文中的代碼,不難看出再獲取同步狀態失敗后,會執行入隊操作。

3.3 何時執行出隊操作?

當線程獲取同步狀態失敗時,會被封裝成Node節點加入到等待隊列中,此時所有節點都回進入自旋過程,首先判斷自己prev是否時頭節點,如果是則嘗試獲取同步狀態。
被阻塞線程的喚醒主要以靠前驅節點的出隊或阻塞線程被中斷來實現。

/**
 * 同步隊列中節點,嘗試獲取同步狀態
 * 
 * 1. 當一個線程獲取到同步狀態時,會將當前線程構造程Node並設置為頭節點
 * 2. 並將原始的head節點設置為null,以便於垃圾回收
 */
final boolean acquireQueued(final Node node, int arg) {
    boolean failed = true;
    try {
        boolean interrupted = false;
        for (;;) {
            final Node p = node.predecessor();
            if (p == head && tryAcquire(arg)) {
                setHead(node);
                p.next = null; // help GC
                failed = false;
                return interrupted;
            }
            if (shouldParkAfterFailedAcquire(p, node) &&
                parkAndCheckInterrupt())
                interrupted = true;
        }
    } finally {
        if (failed)
            cancelAcquire(node);
    }
}

四,條件等待隊列

條件變量(ConidtionObject)是AQS中的一個內部類,用來實現同步隊列機制。同步隊列復用了等待隊列中Node節點,所以同步隊列到等待隊列中不需要進行額外的轉換。

4.1 什麼時候執行入隊操作?

當線程獲取到同步狀態,但是在臨界區中調用了await()方法,此時該線程會被加入到對應的條件隊列匯總。
ps: 臨界區,加鎖和釋放鎖之間的代碼區域

/**
 * ConditionObject中的await方法,調用后使得當前執行線程加入條件等待隊列
 */
public final void await() throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
    Node node = addConditionWaiter();
    // -----省略代碼------
}
/**
 * 添加等待線程
 */
private Node addConditionWaiter() {
    Node t = lastWaiter;
    // -----省略代碼------
    // 將當前線程構造程條件隊列節點,並加入到隊列中
    Node node = new Node(Thread.currentThread(), Node.CONDITION);
    if (t == null)
        firstWaiter = node;
    else
        t.nextWaiter = node;
    lastWaiter = node;
    return node;
}

4.2 什麼時候執行出隊操作?

當對應的Conditioni調用signial/signalAll()方法時回選擇從條件隊列中出隊列,同步隊列是通過自旋的方式獲取同步狀態,而條件隊列中的節點則通過通知的方式出隊。條件隊列中的節點被喚醒後會加入到入口等待隊列中。

/**
 * 喚醒當前條件等到隊列中的所有等待線程
 */
public final void signalAll() {
    if (!isHeldExclusively())
        throw new IllegalMonitorStateException();
    Node first = firstWaiter;
    if (first != null)
        doSignalAll(first);
}
/**
 * 遍歷隊列,將元素從條件隊列 加入到 同步隊列
 */
private void doSignalAll(Node first) {
    lastWaiter = firstWaiter = null;
    do {
        Node next = first.nextWaiter;
        first.nextWaiter = null;
        transferForSignal(first);
        first = next;
    } while (first != null);
}
final boolean transferForSignal(Node node) {
    // -----省略代碼------
    // 執行入隊操作,將node添加到同步隊列中
    Node p = enq(node);
    int ws = p.waitStatus;
    if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
        LockSupport.unpark(node.thread);
    return true;
}

五,總結

  1. 使用Node實現的FIFO隊列,可以用於構建鎖或者其他同步裝置的基礎框架
  2. 利用一個int類型的屬性表示狀態
  3. 使用模板方法模式,子類可以通過繼承它來管理狀態實現各種併發工具
  4. 可以同時實現獨佔和共享模式

本文對AQS的基本原理進行的簡要的描述,對於子類的公平性和非公平行實現,中斷,隊列中節點的等待狀態,cas等操作沒有進行探討,感興趣的小夥伴可以進行源碼閱讀或者查閱相關資料。

六,Q&A

Question1: 在java中通常使用synchronized來實現方法同步,AQS中通過CAS保證了修改同步狀態的一致性問題,那麼對比synchronized,cas有什麼優勢不同與優勢呢?你還知道其他無鎖併發的策略嗎?

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

日本男童「免農藥除草大作戰」 農夫大讚:非常有效

摘錄自2020年3月24日中時報導

一名日本網友在推特表示,她在家中庭院內種植秋葵,但只要一到夏季,雜草就會生長得特別快,而她就讀小學的兒子看到這種情況,便主動說要以「除草」為主題,當作暑假作業來做研究,而且要「不使用農藥」。

兒子在三年間嘗試過多種方法,都無法完全清除雜草。某一天他突然靈機一動,發現土壤的軟硬度是導致雜草生長的關鍵,於是他決定每天在土壤上跑步。從今年的1月5日起到3月1日,不論晴雨,他每天都在土壤上奔跑,每次跑30分鐘,沒想到短短2個月後,雜草就不再生長了。

也有農民認同此方法「身為一名農民,這是非常有效的除草方法,可在雜草種子發芽時挪動土壤,在雜草生根前徹底將其消滅。」

環境經濟
農林漁牧業
國際新聞
日本
除草

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

10種改變 看懂武漢肺炎正對能源、氣候變遷造成什麼影響

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

三菱再爆電動車里程造假疑雲

日商三菱汽車日前自爆旗下汽車油耗測試造假,如今連電動車款也出了問題。日媒指出,三菱在海外銷售的電動車i-MiEV也涉及謊報里程耗電數據問題。

德國福斯汽車去年爆出排放廢氣造假醜聞,引發各界譁然。今年四月20日,日商三菱汽車也自爆迷你車款油耗測試造假,並開始研擬補償機制。但一波未平、一波又起,日媒產經新聞指出,三菱的外銷款電動車i-MiEV在里程耗電數據方面也有造假情事,可能與三菱迷你車款一樣,用竄改空氣與輪胎阻力、抑或是採用時間較短的美國「高速慣性行駛法」測試,讓油耗/電耗數據較實際狀況降低5~10%。

若三菱電動車確實也牽涉里程造假,則旗下有問題的車款已包括:RVR、Outlander、Pajero、Minicab MiEV、i-MiEV等。日本相關當局要求三菱在27日之前繳交報告。

自三菱自爆油耗造假醜聞已來,三菱的股票持續重挫,直到4月22日止,市值已蒸發3,600億日圓左右。

(照片來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

小胖李的面試之旅(二)

上一篇:

#0 前言

上一篇寫完之後我就給媳婦做飯去了。。沒看,然後瀏覽量居然又過2000了。好開心!謝謝大家的鞭策。其中又100%的回復都非常的中肯。這是我必學的內容,

所以我就想問問各位回復的老鐵。你們是怎麼知道我是瀋陽的?????

 

#1 降薪

經過上一周的面試經驗總結,講各大招聘網站的薪資全面下降500-1000的檔次,效果非常明顯,周五一天的面試電話等於平時2天的量,

所以側面證明我要的薪資過高,直接讓HR把我pass了。

 

#1 小工廠

公司性質:工業工廠

福利:五險一金(最低)+雙休

面試職位:軟件開發工程師

簡歷途徑:智聯招聘

面試方式:face to face

這是一家做熱電的工廠企業,小工廠,但是根據企查查等app查看,是一家外企,離家比較近,去了之後發現是一家佔地面積不大的工廠,廠房設備老舊。

說他小,其實應該並不小,可能是我這幾年去過的工廠都太大了,這家顯得比較小。

並在車上反覆溫習之前的面試題,進到廠區后給HR打電話,不一會一個男的過來問我是面試的吧,我說,對。

他說:你寫一下你基本情況,給你筆。上2樓,有個休息區,你在哪等我就行,我一會就上去找你。

我說:好的

上了二樓就是樓梯的位置有一個桌子,我一猜,估計就是這了,坐下后,刷刷刷寫。

一直寫到了:

 

猶豫了一下,寫個8500,我就想知道,他怎麼問,因為這個薪資是他們能接受的範圍。他們給出的薪資是 8k-10k

在寫到了:

 

 我真的很想寫  唱,跳,rep,籃球。。但是我控制住了。

等了能有20分鐘吧,HR帶着技術總監來了。

技術總監很嚴肅

進去之後,HR先給自己研磨了一杯咖啡,我TM以為給我的呢!

我和技術總監面前什麼都沒有,做了一個簡單的自我介紹。

技術總監:你會EF嗎?

小胖李:會,但是我們一般不用,因為有一定的局限性

技術總監(點頭):的確有一些局限性

小胖李:那種框架的東西,學起來也簡單,一般我們底層用ibatis

技術總監:會oracle嗎?

小胖李:不會,但是oracle的語法和mssql是很相似的,類似c#與java的關係

技術總監(點頭):是很相似但是還是有不一樣的地方

小胖李:的確,例如oracle沒有視圖的概念,存儲過程和函數也是有一定的區別的

技術總監(點頭):你說你以前是做能源的,你們是怎麼做的

小胖李:通過三種方式:1 2 3

技術總監 and HR (頻頻點頭)

技術總監:我沒問題了

HR:你期望薪資為什麼比你現在的工資還低?

小胖李:我未來的職業發展我想定位資深技術開發工程師,其次,我現在因為經常不休息,所以當前工作給的工資比較多,如果到一個可以正常休息雙休和福利保險的公司。

那麼我不會要太高的價格

HR:哪你能接受出差嗎?

小胖李:一個月以內的可以接受

HR:回去等通知吧

總結:

這一次面試我是完全賭的成份,因為我不會EF。但是這一次感覺沒問什麼東西,但是感覺又問了一些東西,只不過沒有答到面試者的那個點上,不過新的突破就是終於輪到HR問薪資的問題了,比之前強了一點點。

 

 

#2 玄學公司

公司性質:市政監控和道路監控

福利:五險一金(最低)+雙休

面試職位:軟件開發工程師

簡歷途徑:BOSS

面試方式:face to face

這家單位是周末找到我並且邀請我去面試,BOSS和我聯繫的人向我推了他們技術總監的微信,加了之後看一眼朋友圈,整個一個玄學大師。研究易經的,我都懷疑我是不是被騙子公司給找到了。

看這情況,就有點不想去了,所以什麼都沒準備,直接去面了。

技術總監:介紹一下自己

小胖李:巴拉巴拉巴拉

技術總監:問你幾個問題。。。什麼是事件?

小胖李:(我要說 按鈕的 click 是事件是不是就是純扯淡?)我們很少用 事件,委託這些。

技術總監(閉眼):你知道L……I……N……Q嗎?

小胖李(3秒蒙逼):您說是 linq吧?

技術總監(睜眼):對,你知道是做什麼的嗎

小胖李:我知道,linq我的個人理解是程序級的的快速擴展性查詢,一般都用在集合上,我一般常用的where,desc等這些和lambda差不多,沒lambda那麼強大而已。。。。。

技術總監(不耐煩):不用說了,假設查詢 表某一列大於500的 數據總數怎麼查?

小胖李:where 那一列 500, count總數就可以了

技術總監:表連接有哪些

小胖李:左聯,右連,內連

技術總監:堆棧有什麼區別

小胖李:一個是存值類型一個存引用類型

技術總監:不準確

小胖李:嗯。。。。。。。

技術總監:站在內存角度考慮一下

小胖李:(老子c#也不管內存了啊)。。。。。

技術總監:我沒問題了

尷尬的沉默時間。。不說讓我走也不說後面還有啥。。我就尷尬的看着他和老闆,我決定打破這個沉默
小胖李:咱們公司是有五險一金和雙休的吧

老闆:有的,你想要多少薪資?

小胖李:8500到9000

老闆:嗯。。。

又他媽就沉默……

小胖李:哪沒問題的話我就先走了?

老闆(如負釋重):行,你回去等通知吧,這两天就告訴你

小胖李:好的

面試題:

1,事件,委託是什麼東西

  事件是一種特殊的委託,委託是將方法作為變量

2,堆棧的區別是什麼

  棧:是一個先進后出的數據結構,通常用於保存方法(函數)中的參數,局部變量. 

    堆:是一個可動態申請的內存空間(其記錄空閑內存空間的鏈表由操作系統維護)

總結

這次面試雖然也問到了價錢這一關,但是也出現新的問題,要對一些不常用的東西的理論知識有所了解。

 

#3 又是一個新的外包公司

公司性質:市政監控和道路監控

福利:五險一金(最低)+雙休+福利假(?)

面試職位:軟件開發工程師

簡歷途徑:BOSS

面試方式:電話面試

和上一篇文章的大型外包公司是同類型,同地點的,只不過又換了一家分包商,本來不是很在意的,因為我知道過的可能性很低,但是該準備還是要準備的。一邊玩遊戲,這邊電話就來了

PM:你在項目一般都是什麼職位

小胖李:項目經理,開發者,需求分析師

PM:能說說嘛

小胖李:一般項目交給我之後我負責前期需求溝通,中期的開發,以及後期的培訓溝通會等等,一直到項目驗收階段為止,不負責收錢,其他基本都是我負責。

PM:也就是項目的主要負責人被

小胖李:對,主要負責人之一

…… 沒了,整個電話面試8分鐘左右,沒有討論任何技術問題,只是對我個人做一個了解,我也和他實話實說,我面過你們的總包,只不過被pass了,1選3。

結果:面試通過。。。很意外的面試通過。。毫無準備的那種。12月份入職

總結:有時候不吹牛逼,聲音沉穩一些,對方可能就認為你是個大佬。

 

#4 電腦城的一家互聯網公司

公司性質:面向全市老百姓的互聯網公司

福利:五險一金(最低)+雙休(忙季 單休)+福利假

面試職位:軟件開發工程師

簡歷途徑:前程

面試方式:筆試+face to face

這個是在上一家外包公司沒有給我結果的時候答應人家去面試的,所以做人不能食言該去就要去,去了之後做了20道筆試題,筆試題如下鏈接:

和這個差不多內容,反正就是百度能查得到的內容。

PM(翻看我的筆試題):你覺得我們的面試題怎麼樣?

小胖李:都是百度的內容,基本就是比較熱門的面試題,屬於基礎內容,題目一部分出自於博客園一部分出自黑馬

PM:…….你怎麼知道

小胖李:我在來之前在家看了。。上面很多題我都看了,但是我沒有按照原答案寫,我就挑我會的在項目中使用過的寫了一下,而且是按照我的理解寫的

PM:那你說一下什麼時候用抽象類什麼時候用接口

小胖李:不會,但是大部分的項目都是用接口吧?畢竟接口是多態的一種。

PM:抽象類難道不是嗎?

小胖李:沒具體研究過,因為實際項目中不會用到抽象類,這個東西沒印象

PM:哪抽象類的關鍵字是什麼?

小胖李:。。。。波浪線?

PM:不是。波浪線是析構函數,你學會c++?

小胖李:沒有,我就忽然想起來,c#裏面有個波浪線的寫法

PM:析構函數在c++和c#的作用和方式是一樣的

小胖李:受教了

PM:哪你這道題 string s=new string(“xyz”) 實現了幾個 string object 為什麼寫了一個呢?

小胖李:因為他就 new了一次呀

PM:哪 “xyz”呢

小胖李:難道您的意思是指 new了一個新的對象之後 xyz指向了這個的對象嗎?

PM:差不多這個意思

PM:attribute 是做什麼用的?

小胖李:方法或者類的特性

PM:具體一點呢

小胖李:嗯。。。沒怎麼了解過,但是我的項目中是把這個作為一種事物回滾的時候使用

PM:???具體說一下什麼是回滾

小胖李:回滾就是同時發生2件以上的事情,有一個成功一個失敗的情況下為了讓數據統一減少臟數據,講成功的那件事情回滾回去

PM:嗯。。為什麼不直接用sql的事物呢

小胖李:因為我們框架帶呀

PM:。。。。特性可不是用來做這個的,這個東西是用來做反射的

小胖李:哦 哦,,但是不是說反射不安全么?動態的講程序級映射出去

PM:哪有,哈哈哈

小胖李:看來我這方面知識挺匱乏

PM:你看你寫的 const 和 readonly的區別,一個是只讀一個不是,常量難道不是只讀嗎?

小胖李:那也是只讀的話這倆還有啥區別了呢?

PM:對啊,你說呢

小胖李:嗯。。。。。。

PM:一個是在編譯前就知道結果,一個是編譯中知道結果

小胖李:原來是這樣。哈哈哈

PM:能說說out和ref的區別嗎

小胖李:ref呢。。就是 傳進去一個變量,在方法結束后 在方法外可以訪問這個變量並且知道結果

PM:out呢

小胖李:具體不太了解,就用過一次,是我的方法需要返回兩個結果才這麼用的

PM:看字面意思也是用於返回兩個結果

小胖李:哦,哦,哪為什麼不用list,hashtable返回多個結果呢

PM:你的意思是在創建一個對象返回多個結果?

小胖李:對啊

PM:。。。。嗯。。。

 

PM:你看我們的面試題還行吧

小胖李:看着沒難度,但是理論知識要的還是蠻多的,我理論知識還是比較匱乏的

PM:也不完全是,比如CLR這個很多人都不知道啥意思,你至少寫出來了。

小胖李:哈哈

PM:給你XXXX,行嗎

小胖李:我回去考慮一下哈

結果:面試通過,但是給的比我要的還要低。。

總結:一共聊了能有半個多小時吧,中途還接一個面試邀請電話,但是這家單位側重於理論知識還是很多的,其實能通過面試題和面試題的擴展知道自己的知識點差在什麼地方,只不過是自己忽略了。

並且在平時的工作中沒有使用這些複雜的東西。自己的知識面停留在幾年前,而且基礎知識有一些偏差性,不是全理論覆蓋。。這個也是需要補充學習的。

 

 

#5 躲在居民區的小作坊

公司性質:真 · 小作坊

福利:五險(最低)+(單休)

面試職位:軟件開發工程師

簡歷途徑:前程

面試方式:筆試+face to face

這家單位在購物街的後面的小區里,雖然外面掛着大牌子寫着孵化基地,裏面明顯是改造的樓,一大堆小公司,看起來就不是很正規的樣子。進去之後先讓我做一套筆試題。

這套筆試題5分鐘答完。掃一眼就知道答案,而且全是選擇題。。。我也不知道這個公司怎麼想的,最後還通過他們的網站收集了一波我的個人信息,包括手機號,照片,身份證。。。

本來不想面了,因為公司不大,領導倒是挺有派頭,,,不過用啤酒杯喝茶也是奇葩。。沒問我任何技術問題,只是隨便東扯扯,西扯扯。找他們要了一個離譜的價格我就撤退了

總結:這家單位有詐騙的嫌疑,在前程上寫的是 五險一金+雙休+各種福利,結果去了之後告訴我只有五險和單休。還有就是 太簡單的實踐類問題的企業就不要去了,基本很小很騙人。

 

#6 彩蛋

為了提升自己在智聯的簡歷排名,花了88塊錢買了個簡歷置頂15天。結果是簡歷瀏覽數從0變成1。。。看我的這家還是我主動投的。這是我花的最大頭的88塊錢。

但是有意思的是,花了這88之後,前程和boss電話和消息就沒斷。。。花一份錢享受3家VIP。。賺了!~

 

#7 福利好的互聯網企業

公司性質:房產互聯網企業

福利:五險一金(全額)+雙休+福利假+附加福利假

面試職位:軟件開發工程師

簡歷途徑:BOSS

面試方式:筆試+機試+face to face

說實話,這家企業在我年輕的時候去面過一次沒過,這次又去面還是沒過。哈哈哈哈,但是他家的待遇是真的不錯,分為筆試和機試,初試是筆試,但是很明顯筆試沒過,就算我這麼抄百度都沒過。。。哎。。

對話也沒什麼營養,描述一下為什麼在前幾家單位離職,對方和我說一下他們想招的是什麼級別的人,雖然勉強能夠上,但是人家不是很想勉強的要我。哈哈哈,沒關係等以後有機會在來面試。 

這家單位真的挺值得去的,可以和他們一起學習技術,通過我內部得到的消息,他們在做技術轉型很多技術還是大家一起學習的,但是福利好也意味着規矩多。和我一個城市的小夥伴可以自己考慮考慮。

 

#8 航空企業

公司性質:民航企業下屬單位

福利:五險一金(全額)+雙休+福利假

面試職位:軟件開發工程師

簡歷途徑:前程

面試方式:face to face

主要問的內容偏向於,是否能獨立搭建框架,能否處理大數據,回答的磕磕巴巴。不過福利待遇是真的很棒,先以外包身份進去,

然後會過一段時間轉為這個公司的正式員工,上級公司是民航。。目前還在招人的狀態,估計開春會有一個大面積招人的可能。有興趣的小夥伴可以在前程上更新一下自己的簡歷。

 

#9 最後一節

我已經選擇了外包公司,準備入職,所以不再面試。上一篇博客很多小夥伴猜到我是哪個城市了,那麼我說的這幾家單位大部分都能猜到,後面幾個沒有寫具體的對話內容是因為我是一天内面了這3家,太累了,一天答了兩份筆試

叨叨3次自己經歷,路上多次差點追尾別人。。給大家能帶來的總結就是

技術要掌握 

net core 

mvc 4 

mvc 5

那麼基本問題都不大,最後說的航空和互聯網企業,我真的蠻看好的,互聯網企業是穩定的技術更新換代,他們肯定也不會在短期內把平台換成java,因為他們家是專註做net c#,航空這個應該屬於新成立的,一切都在起步階段

他們的未來發展前進也很廣,同樣也很穩定,基本干到50歲不愁的那種。雖然最後只有2家面試通過,但是真的在面試中學習很多知識。理論的知識點,實際的操作內容。語言的溝通等等。

 

年底有一些前瞻性的公司已經開始做人才儲備,也就是屬於那種提前錄取批次,有想法的朋友可以更新一下簡歷和做一些筆試題。年後還應該是常年那樣的爆發一波招聘。

 

好了,祝大家前程似錦

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

鋰離子電池遇強敵,鋅空氣電池每 KWh 成本已低於 100 美元

摘錄自2018年10月1日科技新報報導

鋰離子電池雖然具有能量密度高、充放電速度快優勢,但容易短路起火、大規模裝置成本也偏高,普遍成本落在每 KWh 300-500 之間。對此,美國加州鋅空氣電池公司 NantEnergy 表示,鋅空氣電池每 KWh 成本比鋰離子電池還要低,已降至100 美元以下。

該電池陽極是由低成本與蘊含量豐富的鋅製成,陰極材料更是採用空氣中免費的氧氣,充電過程中,電力可將氧化鋅轉換成鋅與氧氣,以鋅當作儲存能量的方式,若有用電需求,鋅則會在空氣中氧化來產生電。資深工程師 Sherif Abdelrazek指出,鋅空氣電池不會像鋰離子電池那麼容易起火,不需要藉由外部冷卻系統來防止過熱,且具有成本優勢,相當適合發展大規模電池儲能系統。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

海螺型材欲控股奇瑞新能源汽車

海螺型材日前發佈公告稱,公司將購買奇瑞新能源汽車技術有限公司股權,並取得該公司的控股權。該公告的披露,意味著奇瑞、海螺,這兩家蕪湖本土重量級的企業“航母”之間,將就奇瑞新能源汽車技術有限公司的股權購買,進行重大交易。

2015年底,奇瑞汽車股份有限公司就通過長江產權交易中心,掛牌轉讓旗下控股子公司奇瑞新能源汽車技術有限公司30%的公司股權,對價為 9.22億元。該部分股權被拆分為4個標的,分別包含15%、5%、5%和5%股權。資料顯示,奇瑞新能源註冊資本25億元,目前有3家股東,其中,奇瑞 汽車持有其60%的股權,蕪湖市建設投資有限公司持有30%的股權,蕪湖瑞健投資諮詢有限公司持有10%股權。長江產權交易中心公示顯示,該項股權出讓 “已成交”。

據悉,奇瑞新能源汽車2015年銷售14299輛,同比增長59%;其中奇瑞EQ純電動汽車累計銷售超過8000輛。奇瑞新能源將在無人駕駛領 域發力。今年5月16日,互聯網巨頭百度公司與蕪湖市政府在北京正式簽訂合作協定,宣佈將在蕪湖共同建設全球首個“全無人駕駛汽車運營區域”,百度還將與 奇瑞聯手打造全自動駕駛汽車。奇瑞方面還向外透露,與百度合作開發的無人駕駛電動汽車計畫在今年年底的世界互聯網大會上展示,預計2016年下半年“登陸 資本市場”。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!