共享资源、冲突、共享访问 - 1

“嗨,阿米戈!我想告诉你关于共享资源的事。当然是跨不同的线程。

“我一直在谈论使用多线程时发生的问题以及如何解决它们。这并不意味着使用线程是不好的。线程是一个非常强大的工具。事实上,它们可以让你的程序更快,甚至更可靠。程序越复杂,线程和各个独立部分就越多。

“将程序拆分为独立(松散耦合)的部分非常有益。”

“想象一下,你的程序在内部被分成了 100 个线程。但你只有一个双核处理器。这意味着平均每个内核上会执行 50 个线程。”

“如果你需要提高程序的性能,你只需购买一台双处理器服务器和几个漂亮的处理器。这可以让你达到 32 个内核,从而提高 2-20 倍的性能。取决于数量它被分成真正独立的部分。”

“这是Java在企业开发中占主导地位的原因之一。如果一家公司有一个由20个开发人员编写的复杂内部程序,那么购买另一台服务器比通过优化将程序性能提高一倍要便宜得多。”

“所以这就是它的全部意义所在。”

“但是!每次开发人员决定使用另一个线程时,他都会解决一个问题并创建两个问题。越来越多的线程不会无休止地提高程序的性能。”

“首先,任何程序都有不能拆分并在不同线程上并行运行的工作。其次,所有线程都在同一个处理器上执行。线程越多,每个线程的工作速度就越慢。”

“而且,最重要的是,线程经常使用相同的对象(通常称为‘共享资源’)。”

“比如,一个线程想把自己完成的工作的信息保存在一个文件中,如果有多个这样的线程,它们要向同一个文件写入信息,就会互相干扰。要防止文件成为一个文件混乱,对文件的访问是有限的,即当一个线程使用该文件时,其他线程等待。”

“是的,我记得。你用同步关键字来做到这一点。”

“非常正确。”

“如果线程正在写入不同的文件怎么办?”

“形式上,这些是不同的对象,但它们可能在同一个硬盘上。”

“那么,真的有可能在处理器内部并行化某些东西吗?”

“从技术上讲,是的,但是一旦你的线程除了它所拥有的数据之外还需要一些东西,那一些东西可能已经被另一个线程占用了——你的线程将不得不等待。”

“好吧,那我该怎么办?我怎么知道我是否应该制作很多线程?”

“这直接由你的程序架构决定。每个项目都有自己的‘架构师’,他知道程序中使用的所有‘资源’,知道它们的局限性,以及它们并行化的程度。”

“如果我不知道呢?”

“有两种选择:”

a)在某人的监督下工作

b)得到一些肿块自己弄清楚

“我是一个机器人:我没有肿块——只有凹痕。”

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

“我明白了。谢谢。你澄清了一些我已经开始怀疑的事情。”