套接字输入和输出的单独线程

2023-12-26

我被分配去解决多线程 java 服务器的一些性能和随机崩溃问题。尽管线程和线程安全对我来说并不是真正的新主题,但我发现设计一个新的多线程应用程序可能比尝试调整一些遗留代码困难一半。我浏览了一些著名的书籍来寻找答案,但奇怪的是,只要我阅读并分析所提供的例子,一切似乎都清晰了。然而,当我第二次查看我应该处理的代码时,我不再确定任何事情!一定是理论知识太多而现实经验太少什么的。

无论如何,回到主题,当我在做一些在线研究时,我遇到了这段代码 https://stackoverflow.com/questions/511552/reading-from-a-socket-not-waiting-for-input。一直困扰我的问题是:在没有同步的情况下从两个单独的线程调用套接字上的 getInputStream() 和 getOutputStream() 真的安全吗?或者我现在对整个线程安全问题有点过于偏执了?猜猜这就是当连续第五本书告诉您并发可能会出现多少问题时会发生的情况。

附言。抱歉,如果问题有点长或者太“菜鸟”,请对我宽容一点——这是我在这里发表的第一篇文章。

Edit:需要明确的是,我知道套接字在全双工模式下工作,并且同时使用它们的输入和输出流是安全的。当您在主线程中获取这些引用然后用它们初始化线程对象时,对我来说似乎很好,但是也安全吗get两个不同线程中的那些流?

@rsp:

所以我检查了Sun的代码并且PlainSocketImpl正如您所说,确实在这两种方法上同步。Socket然而,事实并非如此。getInputStream() and getOutputStream()几乎只是包装SocketImpl, so probably并发问题不会导致整个服务器爆炸。尽管如此,由于时机有点不幸,似乎事情could出错(例如,当该方法已经检查错误条件时,其他线程关闭套接字)。

正如您所指出的,从代码结构的角度来看,为每个线程提供流引用而不是整个套接字是一个好主意。如果不是每个线程也使用套接字这一事实,我可能已经重组了我正在处理的代码close()方法(例如,当套接字收到“shutdown”命令时)。据我所知,这些线程的主要目的是将消息排队以进行发送或处理,因此也许这是违反单一责任原则的,并且这些线程不应该能够关闭套接字(与分离的调制解调器接口 http://www.objectmentor.com/resources/articles/srp.pdf)?但如果我持续分析代码太久,就会发现设计通常存在缺陷,整个事情都需要重写。即使管理层愿意付出代价,认真重构遗留代码、没有任何单元测试以及处理难以调试的并发问题,也可能弊大于利。不是吗?


套接字的输入流和输出流代表两个独立的数据流或通道。在它们之间不同步的线程中使用两个流可以完美保存。套接字流本身将阻止对空或满缓冲区的读取和写入。

Edit:Sun 的套接字实现类,用于同步getInputStream() and getOutputStream()方法,然后从不同线程调用应该可以。不过,我同意您的观点,从代码结构的角度来看,将流传递到使用它们的线程可能更有意义(例如,依赖注入有助于测试。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

套接字输入和输出的单独线程 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 如何在python中使用套接字而无需等待

    我用Python创建了一个游戏 该游戏由几条蛇组成 每条蛇由不同的计算机控制 每台计算机都会向服务器计算机发送蛇所指向的角度 问题是该命令 client mess client socket recv 1024 极大的抑制了服务器的运行 导
  • 使用 aws-sdk 从 javascript(reactjs) 调用 lambda(node/express - 无服务器快速路由)

    Reactjs const result await invokeLambda points 调用Lambda js const AWS require aws sdk AWS config update accessKeyId id se
  • 调试时忽略 Visual Studio 中的项目

    在 Visual Studio 中 如果您有一个包含许多项目的解决方案 是否可以指示调试器忽略某些项目 在这个意义上将它们视为外部 DLL 吗 我们有很多我想调试的帮助程序代码 例如 如果我处于函数调用中 并且进入其中 我想跳过 IoC 代
  • 数组的 IsEmpty() 函数

    我想测试我的数组是否为空 我尝试使用该功能IsEmpty 但函数总是返回False 并且不要输入 if 条件 我的代码如下 Sub Freeze Dim tab freeze as variant If IsEmpty tab freeze
  • Scala mixin 到类实例

    Scala 中是否可以对类实例进行一些混合 例如 我有一些 MyClass 实例var x new MyClass我想在某些方法或特征上扩展它而不复制它 Edit 我正在寻找延伸的方法x当它被实例化之后 因此 例如在函数方法中 得到x作为参
  • Facebook 转化事件是否有类似于 Google Analytics 的回调功能?

    我在文档中找不到转化跟踪中是否有任何回调功能 https developers facebook com docs ads for websites tag api https developers facebook com docs ad
  • 使用“;”下载文件或文件名中的“#”会破坏文件名

    我有一个名为 AttachmentDownload aspx 的文件 并且 Page Load 方法内部有这样的代码 可以提供下载文件 除包含 的名称外 所有名称均可在 IE 中正常工作 或者 他们允许用户以 AttachmentDownl
  • github 搜索限制结果

    我需要在 Github 上进行大量搜索以获取论文中的统计数据 例如 我需要在 GitHub 上探索大量 Android 项目 但该网站将搜索结果限制为 1000 个 例如 还使用Java GitHub API我尝试使用该方法库org ecl
  • 从 DNX 迁移到 ASP.NET Core 2.0 时 API 丢失/更改

    我一直致力于将应用程序从过时的 DNX 迁移到 ASP NET Core 2 0 在这样做的过程中 我们发现命名空间和 API 几乎没有变化 例如Microsoft AspNet to Microsoft AspNetCore 尽管我已经能
  • android listview 显示所有可用项目,无需滚动静态标题

    我在尝试使某种布局发挥作用时遇到了一些困难 我想要一个列表 列表不必是可滚动的 但应该完整显示 但是 如果总内容高于屏幕 页面本身应该能够滚动 其中包含列表
  • ReactiveUI 与 MvvmCross

    标题说明了一切 根据您的经验 这两个框架之间的主要区别是什么 我们什么时候应该使用其中一种而不是另一种 预期用途 跨平台开发 Windows 8 iOS Android WindowsRT Mac 我在同一个跨平台解决方案中同时使用 Mvv
  • 验证类实例属性的正确方法

    有一个像这样的简单 Python 类 class Spam object init self description value self description description self value value 我想检查以下限制
  • 使用 Pandas 从 CSV 读取整数时如何优雅地回退到“NaN”值?

    使用时read csv对于 Pandas 如果我想要将给定的列转换为类型 格式错误的值将中断整个操作 而不会指示有问题的值 例如 运行如下内容 import pandas as pd import numpy as np df pd rea
  • 将字符串作为条件求值 Java

    我必须从 D B 检索一组列值并将其作为条件进行检查 例如 我会有像这样的字符串 value gt 2 4 lt value lt 6 在 D B 列中 值是一直被比较的值 我将在代码中声明一个变量值 并且我应该评估这个条件 int val
  • GoLand 的运行/调试配置窗口中“Go 工具参数”的“-i”选项是什么?

    What is the i option for Go tool arguments in GoLand s Run Debug Configurations window 取自go help build The i flag instal
  • 关闭弹出窗口时刷新父页面

    我有一个父页面 我在其中添加了搜索功能 像下面这样 function FunClick StrPriCaption var StrPriHTML if StrPriCaption AdvSearch document getElementB
  • 画布工具提示出现在画布之外?

    我使用 KineticJS 和 D3 js 制作了以下内容 我使用 KineticJS 让我在用户将鼠标悬停在其中一个点上时弹出工具提示 但是 由于画布的边界 工具提示看起来被切断 有什么办法可以让它出现而不被剪掉吗 整个代码本身非常庞大
  • Azure SQL - 用户登录失败

    我正在使用免费的 azure 订阅 设置了 SQL 服务器 v12 并在其上创建了数据库 但是 我似乎无法使用在 SQL Server 凭据期间出现提示时设置的服务器管理凭据登录 管理工作室回报 Cannot connect to
  • 本地文件的 NSURLThumbnailDictionaryKey 为空

    我想获取必须在我的应用程序中显示的文件的缩略图 我在这里使用 NSURL NSDictionary thumbnails nil BOOL success fileURL getResourceValue thumbnails forKey
  • 套接字输入和输出的单独线程

    我被分配去解决多线程 java 服务器的一些性能和随机崩溃问题 尽管线程和线程安全对我来说并不是真正的新主题 但我发现设计一个新的多线程应用程序可能比尝试调整一些遗留代码困难一半 我浏览了一些著名的书籍来寻找答案 但奇怪的是 只要我阅读并分