当前位置: 首页 > 知识库问答 >
问题:

socket并发读写的线程安全性

柯波
2023-03-14

tcp套接字是具有双向读写功能的endpoint。在java中,我们可以获得套接字的InputStream和OutputStream。

同时使用这些流是否安全?

据我所知,有一个连接能够在任何给定时间从一个endpoint发送或接收到其他数据。

我正在基于SocketChannels实现nio传输层,我想保留一个线程用于所有写入,一个线程用于接受和读取,但我不确定如果我的线程同时尝试在同一个套接字上读写,会发生什么。。。

共有1个答案

姚鹤龄
2023-03-14

据我所知,有一个连接能够在任何给定时间从一个endpoint发送或接收到其他数据。

或者两者同时进行。这是全双工连接。您可以同时发送和接收。

 类似资料:
  • 如果有多个Java线程同时写入同一个套接字实例,这会影响从同一个套接字读取的对象的完整性吗?例如,对象的内容是否会被弄乱等。对象的顺序可以是随机的。

  • 问题内容: 我的应用程序中有多个线程同时访问BitSet。该文档说: 如果没有外部同步,则BitSet对于多线程使用是不安全的。 它没有说读或写是否不安全。谁能解释。 问题答案: 仅当初始化的最后一个操作与读取该操作的操作之间存在“先于”关系时,A 对于只读操作才是安全的。 最简单的方法是使用。例如: 这足以确保“安全发布”。 但是,如果您不执行此类操作,则无法保证读取的线程将看到完全初始化的状态

  • 本节提供的源代码的例子来说明如何使用 JSSE 将不安全的 Socket 连接转为安全的 Socket 连接。本节中的代码摘自本书 Java SE 6 Network Security(Marco Pistoia 等著)。 第一个例子是“没有 SSL 的 Socket 实例”的示例代码,可以使用不安全的 Socket 设置客户端和服务器之间的通信。此代码是在“使用 SSL 的 Socket 实例”

  • 根据Go博客, 地图对于并发使用是不安全的:它没有定义当您同时读写地图时会发生什么。如果需要从并发执行的goroutines读取映射和向映射写入映射,则访问必须通过某种同步机制进行调解。(来源:https://blog.golang.org/go-maps-in-action) 有人能详细说明一下吗?跨例程的并发读取操作似乎是允许的,但是如果尝试读取和写入同一个键,并发读取/写入操作可能会生成竞争

  • 问题内容: 如果您在同一文件描述符中的两个不同线程中调用(或,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制? 读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心… linux内核会做什么? 让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同? 编辑:根据密切的文档,我们应该确保文件描述

  • 问题内容: 如果我通过Collections.unmodifiableSet()运行HashSet的实例后,它是否是线程安全的? 我问这个问题是因为Set文档指出不是,但是我只执行读取操作。 问题答案: 从Javadoc: 请注意,此实现未同步。如果多个线程同时访问哈希集,并且至少有一个线程修改了哈希集,则必须在外部对其进行同步 阅读不会修改一组,因此您没问题。