共享資源、衝突、共享訪問 - 1

“嗨,阿米戈!我想告訴你關於共享資源的事情。自然地跨不同的線程。

“我一直在談論使用多線程時發生的問題以及如何解決它們。這並不意味著使用線程是不好的。線程是一個非常強大的工具。事實上,它們可以讓你的程序更快,甚至更可靠。程序越複雜,線程和各個獨立部分就越多。

“將程序拆分成獨立(鬆散耦合)的部分是非常有益的。”

“想像一下,你的程序在內部被分成了 100 個線程。但你只有一個雙核處理器。這意味著平均每個內核上會執行 50 個線程。”

“如果你需要提高程序的性能,你只需購買一台雙處理器服務器和幾個漂亮的處理器。這可以讓你達到 32 個內核,從而提高 2-20 倍的性能。取決於數量它被分成真正獨立的部分。”

“這是Java在企業開發中占主導地位的原因之一。如果一家公司有一個由20個開發人員編寫的複雜內部程序,那麼購買另一台服務器比通過優化將程序性能提高一倍要便宜得多。”

“所以這就是它的全部意義所在。”

“但是!每次開發人員決定使用另一個線程時,他都會解決一個問題並創建兩個問題。越來越多的線程不會無休止地提高程序的性能。”

“首先,任何程序都有不能拆分並在不同線程上並行運行的工作。其次,所有線程都在同一個處理器上執行。線程越多,每個線程的工作速度就越慢。”

“而且,最重要的是,線程經常使用相同的對象(通常稱為‘共享資源’)。”

“比如,一個線程想把自己完成的工作的信息保存在一個文件中,如果有多個這樣的線程,它們要向同一個文件寫入信息,就會互相干擾。要防止文件成為一個文件混亂,對文件的訪問是有限的,即當一個線程使用該文件時,其他線程等待。”

“是的,我記得。你用同步關鍵字來做到這一點。”

“非常正確。”

“如果線程正在寫入不同的文件怎麼辦?”

“形式上,這些是不同的對象,但它們可能在同一個硬盤上。”

“那麼,真的有可能在處理器內部並行化某些東西嗎?”

“從技術上講,是的,但是一旦你的線程除了它所擁有的數據之外還需要一些東西,那一些東西可能已經被另一個線程佔用了——你的線程將不得不等待。”

“好吧,那我該怎麼辦?我怎麼知道我是否應該製作很多線程?”

“這直接由你的程序架構決定。每個項目都有自己的‘架構師’,他知道程序中使用的所有‘資源’,知道它們的局限性,以及它們並行化的程度。”

“如果我不知道呢?”

“有兩種選擇:”

a)在某人的監督下工作

b)得到一些腫塊自己弄清楚

“我是一個機器人:我沒有腫塊——只有凹痕。”

“好吧,那麼,得到一些凹痕。”

“我明白了。謝謝。你澄清了一些我已經開始懷疑的事情。”