使用同步 - 1

“嗨,阿米戈!”

“是的,我来了,我来了。”

“今天,我将告诉你如何在实践中使用synchronized。”

“当一个程序有很多对象和线程时,经常会发生多个线程同时处理同一个对象的情况。这样做时,线程会相互干扰。”

“是的,我已经知道了。”

“所以,假设你有一个对象被多个线程访问。你可以做两件事来避免问题。”

“第一种是使用同步块来包装访问对象的每个位置。但如果某些程序员编写直接访问对象的代码,而不使用同步块,则这种方法可能行不通。”

“因此,大多数时候使用第二种方法——使对象线程安全。” “换句话说,同步机制内置于对象本身:它声明其方法是同步的和/或将代码包装在其方法中的同步块中。”

“所以我可能从多个线程使用的任何对象,这几乎是程序中的所有对象,我必须使线程安全?”

“一般来说,是的。实际上,并非程序中的所有对象都被不同的线程使用,但通常有很多。因此,当您开始为线程编写代码并从中访问各种对象时,然后在每次方法调用时你应该问问自己,«这个电话安全吗?»”

“安全的?”

“线程安全的,这意味着它可以从多个线程安全地调用。”

“这里有一些例子。假设你有一个从不同线程访问的 String 对象。正如你应该记住的那样,String 是不可变的——就像所有其他基本类型一样。这意味着一个对象在创建后不会改变.这意味着不可能“破坏”这样的对象。所有不可变对象都是线程安全的。

“嗯,这样事情就简单多了。”

“现在,假设你需要一个可变字符串。”

“嗯,我记得了。这样的字符串有两种:StringBuffer和StringBuilder。StringBuffer和StringBuilder一样,但是它的所有方法都是同步的,它也是线程安全的吗?”

“是的。如果你需要从多个线程访问一个 StringBuilder 对象,你必须用一个 StringBuffer 替换它。否则,迟早线程会同时更改它并“破坏”它。”

“如果从不同线程访问的对象是我自己类的对象怎么办?在这种情况下我是否也需要将同步添加到它的方法中?”

“是的。最好遵循这个规则:所有将从不同线程访问的对象都必须是线程安全的。”

“我明白了。我没想到一切都这么严重。谢谢,艾莉。”

“不客气。我希望当 Diego 给你一些他的简单任务时,这些提示会对你有所帮助。☺”