Java避免竞争条件没有同步/锁定

cn1*_*n1h 7 java concurrency multithreading synchronized race-condition

为了避免竞争条件,我们可以在共享变量上同步write和access方法,将这些变量锁定到其他线程.

我的问题是,是否有其他(更好的)方法来避免竞争条件?锁定会使程序变慢.

我发现的是:

  • 如果只有一个共享变量,则使用Atomic类.
  • 对多共享变量使用不可变容器,并使用volatile声明此容器对象.(我从"Java Concurrency in Practice"一书中找到了这个方法)

我不确定它们的执行速度是否比同步方式更快,还有其他更好的方法吗?

谢谢

Ale*_*exR 7

避免状态.尽可能使您的应用程序成为无状态.每个线程(操作序列)应该在开头采用上下文并使用此上下文将其从方法传递给方法作为参数.

当这种技术无法解决您的所有问题时,请使用事件驱动机制.当您的代码必须与其他组件共享某些内容时,它会将事件(消息)抛出到某种总线(主题,队列,等等).组件可以注册侦听器以侦听事件并做出适当的反应.在这种情况下,没有竞争条件(除了将事件插入队列).如果您正在使用即用型队列而不是自己编码,那么它应该足够有效.

另外看看Actors模型.


Tud*_*dor 4

由于其非阻塞行为,原子确实比经典锁更高效,即等待访问内存位置的线程不会进行上下文切换,这节省了大量时间。

当需要同步时,最好的指导方针可能是看看如何尽可能地减小关键部分的大小。一般想法包括:

  1. 当只有一部分线程需要写入时,使用读写锁而不是完全锁。
  2. 寻找重组代码的方法以减少关键部分的大小。
  3. 更新单个变量时使用原子。
  4. 请注意,一些传统上需要锁的算法和数据结构有无锁版本(但是它们更复杂)。