Java 我应该在修改一小部分的函数中锁定整个对象吗?

Java 我应该在修改一小部分的函数中锁定整个对象吗?,java,multithreading,locking,Java,Multithreading,Locking,我从Java中的多线程开始,遇到了以下问题 假设我们有一个包含整数和其他变量集合的对象 我想创建一个函数,修改集合的一个整数。 它应该锁定整个对象,还是仅锁定集合? 我知道锁定整个对象是可行的,但是如果其他线程试图访问我的对象的其他变量,我担心性能会下降 它应该锁定整个对象,还是只锁定集合 这主要取决于你在这门课上的实际情况。如前所述,您需要同步对所有共享可变状态的访问,因此这里假设您的整个对象是一个共享可变状态,您确实需要使用隐式锁或内在锁来保护对其任何字段的任何读写访问 现在的问题是这些字段

我从Java中的多线程开始,遇到了以下问题

假设我们有一个包含整数和其他变量集合的对象

我想创建一个函数,修改集合的一个整数。
它应该锁定整个对象,还是仅锁定集合?

我知道锁定整个对象是可行的,但是如果其他线程试图访问我的对象的其他变量,我担心性能会下降

它应该锁定整个对象,还是只锁定集合

这主要取决于你在这门课上的实际情况。如前所述,您需要同步对所有共享可变状态的访问,因此这里假设您的整个对象是一个共享可变状态,您确实需要使用隐式锁或内在锁来保护对其任何字段的任何读写访问

现在的问题是这些字段是如何相互链接的

事实上,假设您的字段是胡萝卜的
列表
和汽车的
列表
,它们除了共享可变列表之外没有任何共同点,在这种情况下,您可以为每个字段使用一个专用的隐式或内在锁

但是,例如,如果欧元兑美元汇率和美元兑欧元汇率彼此直接相连,则需要确保这两个字段的一致性,因此需要对这两个字段使用相同的隐式或内在锁

因此,总结一下,如果您的所有字段都使用一个隐式锁或内在锁相互连接,则最好对所有字段使用一个专用的隐式锁或内在锁,否则,请对彼此相关的每组字段使用一个专用的隐式锁或内在锁

它应该锁定整个对象,还是只锁定集合

这主要取决于你在这门课上的实际情况。如前所述,您需要同步对所有共享可变状态的访问,因此这里假设您的整个对象是一个共享可变状态,您确实需要使用隐式锁或内在锁来保护对其任何字段的任何读写访问

现在的问题是这些字段是如何相互链接的

事实上,假设您的字段是胡萝卜的
列表
和汽车的
列表
,它们除了共享可变列表之外没有任何共同点,在这种情况下,您可以为每个字段使用一个专用的隐式或内在锁

但是,例如,如果欧元兑美元汇率和美元兑欧元汇率彼此直接相连,则需要确保这两个字段的一致性,因此需要对这两个字段使用相同的隐式或内在锁


因此,总结一下,如果您的所有字段都使用一个隐式锁或内在锁相互连接,则最好是对所有字段使用一个隐式锁或内在锁,否则,对于彼此相关的字段组,请使用一个专用的隐式锁或内在锁。

如果您从多线程开始,您应该担心正确性,而不是性能。您应该同步对所有共享可变状态的访问。您可以使某些方法同步,只有这些方法的性能才会下降。当然,对同一对象的其他方法的并行调用应该确保正确性。如果他们不能锁定整个对象,这完全取决于你的其他代码。你不能“锁定一个对象”,所以你需要确保所有访问集合的代码都是以线程安全的方式进行的。你肯定会遇到麻烦的。正确性必须胜过表现。编写多线程代码很难,即使对聪明人来说也是如此。不要被愚弄到认为你会一帆风顺。如果你是从多线程开始的,你应该担心正确性而不是性能。你应该同步对所有共享可变状态的访问。你可以使一些方法同步,只有这些方法的性能才会下降。当然,对同一对象的其他方法的并行调用应该确保正确性。如果他们不能锁定整个对象,这完全取决于你的其他代码。你不能“锁定一个对象”,所以你需要确保所有访问集合的代码都是以线程安全的方式进行的。你肯定会遇到麻烦的。正确性必须胜过表现。编写多线程代码很难,即使对聪明人来说也是如此。不要被愚弄到以为你会溜过去。在我的情况下,我确实有一些东西,比如胡萝卜清单和汽车清单。因此,如果我理解正确,我可以使用一套两种不同的锁,一种是胡萝卜锁,一种是汽车锁?是的,这是个想法,很抱歉这个愚蠢的例子,但我认为这样更容易理解没有问题,它实际上帮助我理解,这正是我想知道的。谢谢!就我而言,我确实有一些东西,比如胡萝卜清单和汽车清单。因此,如果我理解正确,我可以使用一套两种不同的锁,一种是胡萝卜锁,一种是汽车锁?是的,这是个想法,很抱歉这个愚蠢的例子,但我认为这样更容易理解没有问题,它实际上帮助我理解,这正是我想知道的。谢谢!