2009年11月,我去了No Fluff Just Stuff。其中一个演示是Brian Goetz,它是关于Java并发性的。由于某种原因,他的议程幻灯片上有一些项目没有在他的演示文稿中涉及。
他回顾了一些策略,最后他指出了一个常见的策略,他还说这是Java中并发的一个很好的经验法则:将变量设置为私有的,并使访问它们的任何方法同步。
这听起来很简单。也许好得令人难以置信。是否存在这种并发技术不够充分的情况/应用程序?主要依赖于此技术在具有大量事务或大型数据集的系统中是否可以很好地工作?这样做的潜在缺点是什么?
发布于 2011-05-17 23:59:39
在某些情况/应用程序中,这种并发技术是不够的吗?
如果您有一个想要同步的操作,该操作跨越了这些方法中的几个,那么将每个单独的方法标记为已同步是不够的。
主要依赖于这项技术的
在具有大量事务或大型数据集的系统中是否可以很好地工作?
我对此表示怀疑,因为操作的同步界限似乎很少是如此细粒度的。
这样做的潜在缺点是什么?
同步不是免费的,获取锁需要一些开销(虽然通常很小)。不必要的同步意味着不必要的成本。
坦率地说,在读完之后,我真的很惊讶Goetz会给出这个建议,因为那本书的主要教训是,并发是一个复杂的主题,使您的应用程序线程安全和性能与并发访问的解决方案是高度定制的应用程序的具体情况,没有简单和快速的答案。
发布于 2011-05-17 23:54:27
虽然对并发编程来说还是个新手,但我不认为并发“让所有成员都是私有的,方法是同步的”是万能的。
看看:http://download.oracle.com/javase/tutorial/essential/concurrency/index.html
此外,当涉及到共享数据(可以由多个线程访问和/或修改的数据)时,您可能会强制使用同步方法。在其他情况下,您可能不必使用synchronized关键字。
发布于 2011-05-17 23:55:39
除了对性能的影响之外,还存在这种级别的保护不足的情况。例如,setX( ),setY( )。如果你的应用编程接口将它们分开,如果一个线程设置了x1,y1,而另一个线程设置了x2,y2,那么你可能会得到x1,x2。为了避免这种情况,您需要在调用setter之前锁定对象,或者重新设计您的API以支持setXY(x,y)。
https://stackoverflow.com/questions/6033549
复制相似问题