JAVA中多线程同步的替代方法

时间:2018-07-07 03:34:00

标签: java multithreading synchronization

我是多线程技术的初学者,对此有疑问:

在Java中,传统的Synchronization(使用synced关键字)是否还有其他替代方法,因为它会影响应用程序的性能?

1 个答案:

答案 0 :(得分:4)

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

如果您的意思是“是否存在使用共享资源进行多线程的零开销方法”,那么答案几乎肯定是“否”。如果两辆朝不同方向行驶的汽车同时驶近一个交叉路口,那么其中一辆将不得不等待另一辆汽车-不可能让这些汽车同时占据相同的空间。这就是为什么我们有停车标志和交通信号灯的原因。 (或者,像交通圈这样的东西,但是即使那些交通圈也有一些开销-您真的不能像他们不在那里那样全速浏览它们。)

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

  • 无阻塞I / O。这里的论据是,当您与服务器或缓慢的I / O设备或其他东西进行交互时,大部分时间都花在等待设备或服务器的响应上,因此您实际上不需要多个线程来处理那-您只需要允许原始线程在等待响应时做其他工作即可。我在这里的通常比喻是:假设您要和10个人一起出去吃饭。当服务员来点菜时,他要点菜的第一个人尚未准备好。当然,明智的做法是让服务员先接受别人的命令,然后再找第一个人。不需要为每个人的订单分别安排服务员,也不必邀请其他服务员等第一个人,等等。
  • 基于承诺/未来的异步
  • 事件驱动的异步
  • 使用不变的数据结构来最大程度地减少共享资源。
  • 当然,除了已同步的关键字外,还有很多类型的锁定和同步机制,例如计数信号量,读写器锁定等。

还有许多其他类型的并发,例如actor model

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

TL; DR 无论您做什么,都将产生开销-只需选择设计和原语,以使特定用例的开销最小。