2015-12-16 26 views
1

多核允許多個請求並行服務。 每個請求都想訪問Singleton對象中的方法m()(非同步方法)。即使我們有多個內核來處理請求,Singleton對象是否會導致性能下降?

由於我們有單個實例,並非所有在不同內核上執行的線程都可以同時訪問m()方法。

比方說,我們有兩個線程T1和T2在不同的內核上並行執行。 而線程T1當前正在執行m()方法。在另一個內核上執行的線程T2必須等到上下文切換或線程T1完成執行m(),然後線程T2纔會執行m()方法。

由於這個原因,雖然服務請求的線程可以並行執行,但它必須等到線程上下文切換髮生或另一個線程在方法m()上執行完畢。

那麼,單身物體不會影響性能嗎?

回答

2

你錯了你的假設。你說:

每個請求都希望在 Singleton對象訪問的方法M()(非同步方式)。由於我們有單個實例,並不是所有線程都可以同時訪問m()方法 。

這是不正確的。如果該方法未同步,則可以通過與JVM中的線程數相同的線程數來同時執行該方法。對象是單例的事實對此沒有影響;這與問題無關,因爲您沒有使用同步。

因此,答案是:具有與非同步方法的單獨的對象相對性能不會影響到具有多個對象

0

當然不是。線程可以並行執行非同步方法。 將方法看作是每個線程將在其自己的堆棧中執行的一組指令。因此,除非這些指令干擾全局狀態/彼此,否則不會阻止在不同內核上運行的線程並行執行。

想到比喻,讓我們假設你和你的朋友有指令讓自己成爲一個三明治。如果您使用不同的配料,則無法同時製作三明治。

相關問題