Java和C/C++之间多线程方面的区别

10
我已经阅读了一些关于多线程实现的技巧,这在很大程度上取决于您所使用的目标操作系统。最终,操作系统提供了多线程功能,例如Linux有POSIX标准实现,而Windows32有另一种方式。
但我想知道编程语言层面的主要区别。C似乎提供了更多的同步选择,如互斥锁、读写锁、记录锁、Posix信号量。
但在Java中,我知道我们可以使用synchronized来作为互斥锁?还有其他高级API,如AtomicXX和volatile。但我没有找到类似记录锁和读写锁的东西。这是Java语言的弱点吗?还是为了跨平台而做出的牺牲?
此外,我想知道这是否是像Nginx这样的Web服务器和Oracle这样的数据库都使用C/C++编写的主要原因?
我实际上是一名Java开发人员,非常好奇。 希望有人能给我一些建议。
编辑: Paul和Jesper已经建议,在JDK1.5之后,Java支持所有类似于C/C++的锁类。但如果可能的话,我仍然希望有人能更详细地解释为什么Java提供了足够的支持,我们仍然找不到一个纯Java的“Oracle”。
另外,我想添加一些有趣的东西,我从Nasir Khan的developer.com上学到了一些东西。 理解Java多线程和读写锁
  • 共享主内存与线程本地内存的交互方式,
  • 相对于这种交互和互斥排除,"同步"的含义,
  • 澄清对象锁和它所保护资源的区别。

编辑:

来自FileLock JavaDocs的内容:

文件锁是代表整个Java虚拟机持有的。它们不适合用于控制在同一虚拟机中由多个线程访问文件。

Java中的文件锁与C/C++中的完全相同。

更新
我发现另一个有趣的比较领域
在C ++中,有一些东西像

atomic<int> x, y;


在JAVA中我们也有AtomicInteger。 它们是同一件事吗?

3个回答

6

在大多数方面,Java比C/C++略高级,主要是由于JVM提供的抽象。因此,它的效率较低,并且远离操作系统。

同步方法就是其中一个例子,实现可以根据底层操作系统使用不同的机制。

由于效率较低,C/C++更适用于一些需要非常重视效率的任务,就像你提到的那些任务。

我认为(由于JVM提供的抽象和因此更高级),这是C/C++和Java之间差异的主要原因和来源,线程处理方式以及其他差异只是这个主要差异的方面或后果。

特别是关于读写锁,Java提供了使用它们的工具(如先前评论中指出的),很可能您想要使用的任何同步方法都可以在Java中以某种方式使用或实现。JVM将其转换为操作系统调用的方式以及结果的效率是另一回事。


JVM如何将其转换为操作系统调用以及结果的效率是另一回事。这确实是一个很好的问题。 - Clark Bao
1
这取决于操作系统,但我猜开发人员会选择最直接的翻译,这样实现和执行起来就更简单。 - jmora
1
不够有效。这如何衡量? - IgorGanapolsky

4

我提到的记录锁定和信号量怎么样? - Clark Bao
1
@Clark 看看 Paul 建议的 java.util.concurrent 的 API 文档 - 是的,Java 有一个 Semaphore 类,还有很多其他的并发控制类,包括许多专门的集合类。 - Jesper
1
@Clark:虽然它们往往不是市场领导者,但有些数据库系统是用Java编写的(例如Apache Derby、HSQLDB等)。对于记录锁定,您是否指的是http://download.oracle.com/javase/6/docs/api/java/nio/channels/FileLock.html提供的文件锁定类型? - Paul Cager
据我所知,H2不提供并行能力。Derby我不确定。 - Clark Bao
@Paul 你太棒了!我应该感谢你并接受你的答案!但为什么FileLock不在concurrent包中,有点奇怪。 - Clark Bao
显示剩余3条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接