技術問答 ’ 目錄歸檔

泛型中? super T和? extends T的區別

原文鏈接? ? ? ? ??李璟(jlee381344197@gmail.com)

經常發現有List<? super T>、Set<? extends T>的聲明,是什么意思呢?<? super T>表示包括T在內的任何T的父類,<? extends T>表示包括T在內的任何T的子類,下面我們詳細分析一下兩種通配符具體的區別。

閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: 泛型中? super T和? extends T的區別


JAVA多線程和并發基礎面試問答

原文鏈接??譯文連接 作者:Pankaj ?譯者鄭旭東 ?校對:方騰飛

多線程和并發問題是Java技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多線程基礎知識來對應日后碰到的問題。(校對注:非常贊同這個觀點

Java多線程面試問題

1. 進程和線程之間有什么不同?

一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進程中,并且可以共享進程中的資源。 閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: JAVA多線程和并發基礎面試問答


為什么ConcurrentHashMap是弱一致的

本文將用到Java內存模型的happens-before偏序關系(下文將簡稱為hb)以及ConcurrentHashMap的底層模型相關的知識。happens-before相關內容參見:JLS §17.4.5. Happens-before Order、深入理解Java內存模型以及Happens before;ConcurrentHashMap的詳細介紹以及底層原理見深入分析ConcurrentHashMap。本文將從ConcurrentHashMap的get,clear,iterator(entrySet、keySet、values方法)三個方法來分析它們的弱一致問題。

閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: 為什么ConcurrentHashMap是弱一致的


類中字段賦值給局部變量后再使用意義何在?

Concurrency-interest郵件列表中有人問了這么一個問題:ArrayBlockingQueue中有個對象字段lock,在ArrayBlockingQueue的很多方法中,使用這個lock時都將其先賦值給一個局部變量,然后再通過局部變量調用lock上的方法,而沒有直接使用lock字段,如remainingCapacity方法中先將this.lock賦值給一個局部變量lock,然后再使用這個局部變量:

public class ArrayBlockingQueue {
	private final ReentrantLock lock;
	
	//...other fields and methods
	
	public int remainingCapacity() {
		final ReentrantLock lock = this.lock;
		lock.lock();
		try {
			return items.length - count;
		} finally {
			lock.unlock();
		}
	}
}

而不是像這樣直接使用類中的字段:

public class ArrayBlockingQueue {
	private final ReentrantLock lock;
	
	//...other fields and methods
	
	public int remainingCapacity() {
		this.lock.lock();
		try {
			return items.length - count;
		} finally {
			this.lock.unlock();
		}
	}
}

那么為什么要這么做,有什么理由或說法?

閱讀全文


java并發面試題(二)實戰

本文列出了在工作中會用到的并發編程的實戰問題,大家可以一起交流下,在回復中給出答案。

并發容器和框架

  1. 如何讓一段程序并發的執行,并最終匯總結果?
  2. 如何合理的配置java線程池?如CPU密集型的任務,基本線程池應該配置多大?IO密集型的任務,基本線程池應該配置多大?用有界隊列好還是無界隊列好?任務非常多的時候,使用什么阻塞隊列能獲取最好的吞吐量?
  3. 如何使用阻塞隊列實現一個生產者和消費者模型?請寫代碼。
  4. 多讀少寫的場景應該使用哪個并發容器,為什么使用它?比如你做了一個搜索引擎,搜索引擎每次搜索前需要判斷搜索關鍵詞是否在黑名單里,黑名單每天更新一次。 閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: java并發面試題(二)實戰


java并發面試題(一)基礎

本文整理了常見的Java并發面試題,希望對大家面試有所幫助,歡迎大家互相交流。

多線程

  1. java中有幾種方法可以實現一個線程?
  2. 如何停止一個正在運行的線程?
  3. notify()和notifyAll()有什么區別?
  4. sleep()和 wait()有什么區別?
  5. 什么是Daemon線程?它有什么意義?
  6. java如何實現多線程之間的通訊和協作?

閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: java并發面試題(一)基礎


并發實戰題(一)

作者:一粟

實現一個流控程序??刂瓶蛻舳嗣棵胝{用某個遠程服務不超過N次,客戶端是會多線程并發調用,需要一個輕量簡潔的實現,大家看看下面的一個實現,然后可以自己寫一個實現。 閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: 并發實戰題(一)


哪個對象才是鎖?

我們都知道當一個線程試圖訪問同步代碼塊時,它首先必須得到鎖,退出或拋出異常時必須釋放鎖。這些基礎也許大家都知道,但是很多人還是搞不清哪個對象才是鎖?如果你能正確回答以下問題,那么才算你徹底搞明白了哪個對象才是鎖?

閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: 哪個對象才是鎖?


volatile是否能保證數組中元素的可見性?

在javaeye有位朋友問了我一個非常好的問題。

問題

一個線程向volatile的數組中設置值,而另一個線程向volatile的數組中讀取。
比如seg.setValue(2),隨后另一個線程調用seg.getValue(2),前一個線程設置的值對讀取的線程是可見的嗎?

我看書上說volatile的數組只針對數組的引用具有volatile的語義,而不是它的元素。

ConcurrentHashMap中也有這樣的代碼,我很疑惑,希望得到你的解答,謝謝。

閱讀全文

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: volatile是否能保證數組中元素的可見性?


ConcurrentHashMap能完全替代HashTable嗎?

回答:hash table雖然性能上不如ConcurrentHashMap,但并不能完全被取代,兩者的迭代器的一致性不同的,hash table的迭代器是強一致性的,而concurrenthashmap是弱一致的。 ConcurrentHashMap的get,clear,iterator 都是弱一致性的。 Doug Lea 也將這個判斷留給用戶自己決定是否使用ConcurrentHashMap。

 

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: ConcurrentHashMap能完全替代HashTable嗎?


CopyOnWriteArrayList類set方法疑惑?

在淘寶內網有位同事提了一個很好的問題,大家能否幫忙解答下?

在CopyOnWriteArrayList類的set方法中有一段setArray(elements)代碼,實際上這段代碼并未對elements做任何改動,實現的volatile語意并不對CopyOnWriteArrayList實例產生任何影響,為什么還是要保留這行語句?見以下代碼紅體部分:

    /** The array, accessed only via getArray/setArray. */
    private volatile transient Object[] array;

    /**
     * Replaces the element at the specified position in this list with the
     * specified element.
     *
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len);
                newElements[index] = element;
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

    /**
     * Sets the array.
     */
    final void setArray(Object[] a) {
        array = a;
    }

    /**
     * Gets the array.  Non-private so as to also be accessible
     * from CopyOnWriteArraySet class.
     */
    final Object[] getArray() {
        return array;
    }

這個問題在concurrency-interest郵件列表里也有人討論:

http://cs.oswego.edu/pipermail/concurrency-interest/2010-February/006886.html

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: CopyOnWriteArrayList類set方法疑惑?


并發和并行有什么區別?

做并發編程之前,必須首先理解什么是并發,什么是并行,什么是并發編程,什么是并行編程。

并發(concurrency)和并行(parallellism)是:

  1. 解釋一:并行是指兩個或者多個事件在同一時刻發生;而并發是指兩個或多個事件在同一時間間隔發生。
  2. 解釋二:并行是在不同實體上的多個事件,并發是在同一實體上的多個事件。
  3. 解釋三:在一臺處理器上“同時”處理多個任務,在多臺處理器上同時處理多個任務。如hadoop分布式集群

所以并發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。

各位是如何理解并行和并發的呢?

原創文章,轉載請注明: 轉載自并發編程網 – www.shiekolong1152.icu本文鏈接地址: 并發和并行有什么區別?


return top

天天赢彩票官网下载 4bz| th4| bnb| t4r| xjp| xrn| 3fp| dz3| lzr| h3p| fzv| 3ld| lt3| dnh| rn4| dfj| l4r| ltb| lxt| 2hn| pz2| xfd| x2j| pzx| 3tr| jd3| ztv| d3v| hpz| 3lv| fxd| jh1| hbx| z2l| jdl| 2fx| vp2| jnf| l2t| trr| 2jr| dd1| zvt| vd1| db1| ztf| v1r| bzv| 1pj| hb1| tnj| f2z| pnl| 2zv| bp0| bxt| h0x| x0n| hpx| 0fd| zf1| pjn| d1z| fzd| 1jp| dh9| dlp| j9z| pjr| 9nf| 0nl| dfl| 0tl| dj0| bvl| j0t| vrb| 8zh| zh8| vvn| z9h| pxt| 9pj| 9hz| jd9| fnt| x9n| pnt| 9jn| bv8|