Java和C/ c++在多线程方面的差异
Difference in MultiThread aspect between Java and C/C++
我读过一些提示,多线程的实现很大程度上取决于你正在工作的目标操作系统。操作系统最终提供了多线程功能。如Linux有POSIX标准实现,而windows32有另一种方式。
但是我想知道编程语言水平的主要不同。C似乎为同步提供了更多的选择,如互斥锁、读写锁、记录锁、Posix信号量。
但是在Java中,我知道我们可以使用像互斥锁这样的同步工作。以及其他一些高级API,比如AtomicXX和volatile。但我没有发现记录锁和读写锁之类的东西。它是Java语言的弱点吗?还是为了穿越站台而牺牲?
另外,我想知道这是一个主要的原因,web服务器像Nginx和数据库像oracle都写在C/c++ ?
我实际上是一个Java开发人员,我对它非常好奇。希望有人能给我一些建议。
编辑:Paul和Jesper已经建议Java在JDK1.5之后支持所有类似的锁类,比如C/c++。但是如果可能的话,我还是希望有人能更详细地解释为什么Java提供了足够的支持,我们仍然找不到一个纯Java的oracle。
编辑:另外,我想添加一些有趣的东西,我从developer.com学到的Nasir Khan。了解Java多线程和读写锁
里面有些话题
- 共享主进程的交互线程的本地内存记忆中,
- "同步"的含义关于这个相互作用
- 澄清an的区别对象的锁及其保护的资源。
From FileLock JavaDocs
文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机内多个线程对文件的访问。
Java中的文件锁与C/c++中的完全相同。
我发现另一个有趣的比较领域是在c++中,有一些类似于
atomic<int> x, y;
在JAVA中我们也有AtomicInteger
。它们是一回事吗?
Java在大多数方面都比C/c++略高一些,这主要是由于JVM提供的抽象。因此,它的效率较低,远离操作系统。
同步方法就是一个例子,它的实现可以根据底层操作系统使用不同的机制。
由于效率较低,C/c++在一些效率非常重要的任务中更受欢迎,就像你提到的那些。
我认为(由于JVM和更高级别的抽象)是C/c++和Java之间差异的主要原因和来源,即线程的处理方式和其他差异只是这个主要差异的方面或后果。
特别是关于读写锁,Java提供了使用它们的工具(正如前面的评论所指出的),并且很可能您想要使用的任何同步方法都以某种方式在Java中可用或可实现。JVM如何将其转换为OS调用以及结果的效率是另一回事。
Java提供读写锁- http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReadWriteLock.html.
如果您还没有看过java.util.concurrent包,请查看一下。我怀疑Java的支持与C相当。还有一些用Java编写的web服务器使用多线程或异步IO (NIO)。
我相信Java有你提到的锁。
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/package-summary.html如果你对这个主题感兴趣,我向你推荐《Java并发实践》这本书
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- Java和C/ c++在多线程方面的差异