Java和/ C ++之间多线程方面的差异

时间:2011-07-05 13:50:10

标签: java c++ c multithreading

我已经阅读了一些提示,多线程实现很大程度上取决于您正在使用的目标操作系统。操作系统最终提供多线程功能。如Linux有POSIX标准实现和windows32有其他方式。

但我想知道编程语言水平的主要差异。 C似乎为同步提供了更多选择,例如Mutex,读写锁,记录锁定,Posix信号量。

但是在Java中,我知道我们可以使用像Mutex这样的同步作品吗?还有一些其他高级API,比如AtomicXX和volatile。但我没有找到像记录锁定和读写锁的东西。它是Java语言的弱点吗?或者是跨平台的牺牲?

另外我想知道这是一个主要原因,像nginx这样的Web服务器和像oracle这样的数据库都是用C / C ++编写的吗?

我实际上是一名Java开发人员,我对它非常好奇。 希望有人可以给我一些建议。

修改

Paul和Jesper已经建议Java在JDK1.5之后支持所有类似的锁类,如C / C ++。但是如果可能的话,我仍然希望有人可以解释为什么Java提供足够支持的更多细节,我们仍然找不到纯Java“oracle”。

修改

另外,我想添加一些有趣的东西,我是从Nas.com Khan的developer.com上学到的。 Understanding Java Multithreading and Read-Write Locks

其中的一些主题。

  • 共享主体的互动 内存与线程的本地 记忆,
  • “同步”的含义 关于这种互动 和相互排斥。
  • 澄清一个区别 对象的锁和它所守护的资源。

修改

来自FileLock JavaDocs

  

代表整个Java虚拟机保存文件锁。它们不适合控制同一虚拟机中多个线程对文件的访问。

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

更新 我找到了另一个值得比较的有趣区域
在C ++中,有一些像

这样的东西
atomic<int> x, y;


在JAVA中我们也有AtomicInteger。 它们是一样的吗?

3 个答案:

答案 0 :(得分:5)

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

synchronized方法就是一个例子,实现可以使用不同的机制,具体取决于底层操作系统。

由于这种效率较低,C / C ++首选于一些效率非常重要的任务,就像你提到的那样。

我认为(由于JVM和更高级别的抽象)是C / C ++和Java之间差异的主要原因和来源,是如何处理线程以及其他差异只是这个主要区别的方面或结果。 / p>

特别是关于read-write locks,Java提供了使用它们的工具(如前面的注释中所指出的),并且很可能您可能想要使用的任何同步方法在Java中以某种方式可用或可实现。 JVM如何将其转换为OS调用以及结果的效率是另一回事。

答案 1 :(得分:4)

Java确实提供了读写锁 - http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReadWriteLock.html

如果还没有,请查看java.util.concurrent包。我怀疑Java的支持与C相当。还有许多用Java编写的Web服务器使用多线程或异步IO(NIO)。

答案 2 :(得分:1)

我相信Java有你提到的锁。

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/package-summary.html

如果您对此主题感兴趣,我建议您阅读Java Concurrency in Practice一书。