JAVA 多线程同步的替代方案

gho*_*der -1 java multithreading synchronization

我是多线程的初学者,有一个疑问:

java中的传统同步(使用synchronized关键字)是否有其他替代方案,因为它会影响应用程序的性能?

EJo*_*ica 5

正如其他人所指出的,这取决于您想要避免什么,以及您想要通过多线程实现什么。

如果您的意思是“是否有一种零开销的方法来使用共享资源进行多线程处理”,那么答案几乎肯定是“否”。如果两辆朝不同方向行驶的汽车同时接近十字路口,其中一辆将不得不等待另一辆 - 这两辆汽车不可能同时占据相同的空间。这就是为什么我们有停车标志和交通灯。(或者,还有诸如交通环岛之类的东西,但即使是那些也有一些开销 - 你真的不能全速穿过它们,就好像它们不在那里一样)。

除了使用这种类型的同步之外,还有很多方法可以执行异步和并行操作:

  • 非阻塞 I/O。这里的论点是,当你与服务器或慢速 I/O 设备或其他东西交互时,大部分时间都花在等待设备或服务器的响应上,所以你真的不需要多个线程来处理那 - 你只需要允许原始线程在等待响应时执行其他工作。我通常的比喻是:假设你和一群 10 个人出去吃饭。当服务员过来点餐时,他要求点的第一个人还没有准备好。当然,明智的做法是让服务员先接受其他人的订单,然后再回到第一个服务员那里。没有必要为每个人的订单引入单独的服务员,或者引入另一个服务员来等待第一个人,或者类似的事情。
  • 基于 Promise/Future 的异步
  • 事件驱动的异步
  • 使用不可变的数据结构来最大限度地减少共享资源的数量。
  • 当然,除了synchronized关键字之外,还有很多类型的锁定和同步机制可用,例如计数信号量、读写锁等。

还有许多其他类型的并发,例如参与者模型

如果使用得当,它们可以帮助最大限度地减少开销,并可能减少所需的显式锁定和同步量。不过,它们都有开销。

TL;DR无论您做什么,您都会产生开销 - 只需选择可为您的特定用例带来最小开销的设计和基元。