SelectableChannel的register()方法和Selector的select()方法对资源的竞争问题

  无意中看到的, 原帖: http://www.oschina.net/code/snippet_246601_22883
  首先,问问题的人和回答问题的人应该都没有好好的仔细看书.书中已经明确地说到:
SelectableChannel的register(Selector selector, ...)和Selector的select()方法都会操作Selector对象的共享资源all-keys集合.
SelectableChannel及Selector的实现对操作共享资源的代码块进行了同步,从而避免了对共享资源的竞争.
同步机制使得一个线程执行SelectableChannel的register(Selector selctor, ...)时,
不允许另一个线程同时执行Selector的select()方法,反之亦然.
  并且说明解释的也很清楚.
  既然这么说了,那看完书中的代码之后就应该对其进行一些改造,这样才能更好的理解程序.
  为了解答这里的问题,对例子稍微一些改动:
1.
 

 
2.

 
  然后运行程序,这时候​可以看到出现问题了:

 
   查看问题出在何处,首先执行jps查看运行的程序的pid.接下来使用jstack命令.如下:
 
C:\Users\yangkun>jstack 10008
2013-10-27 15:37:16
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):
 
"Thread-0" prio=6 tid=0x000000000ac26800 nid=0x1dd8 waiting for monitor entry [0
x000000000b25f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at sun.nio.ch.SelectorImpl.register(Unknown Source)
        - waiting to lock <0x00000000eb4b3cd8> (a java.util.Collections$Unmodifi
ableSet)
        at java.nio.channels.spi.AbstractSelectableChannel.register(Unknown Sour
ce)
        - locked <0x00000000eb4f2210> (a java.lang.Object)
        at java.nio.channels.SelectableChannel.register(Unknown Source)
        at tcp.selector.SelectorDeadLock.accept(SelectorDeadLock.java:47)
        at tcp.selector.SelectorDeadLock$1.run(SelectorDeadLock.java:83)
 
"Service Thread" daemon prio=6 tid=0x0000000008fa8000 nid=0x2a4c runnable [0x000
0000000000000]
   java.lang.Thread.State: RUNNABLE
 
"C2 CompilerThread1" daemon prio=10 tid=0x0000000008f9c000 nid=0x29b0 waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
 
"C2 CompilerThread0" daemon prio=10 tid=0x0000000008f9a000 nid=0x29ac waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
 
"Attach Listener" daemon prio=10 tid=0x0000000008f99000 nid=0x29b4 waiting on co
ndition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
 
"Signal Dispatcher" daemon prio=10 tid=0x0000000008f92000 nid=0x2a48 runnable [0
x0000000000000000]
   java.lang.Thread.State: RUNNABLE
 
"Finalizer" daemon prio=8 tid=0x00000000025a6000 nid=0x2a40 in Object.wait() [0x
000000000a37f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000eb405798> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        - locked <0x00000000eb405798> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
 
"Reference Handler" daemon prio=10 tid=0x000000000259f000 nid=0x2a3c in Object.w
ait() [0x000000000a1ef000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000eb405320> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
        - locked <0x00000000eb405320> (a java.lang.ref.Reference$Lock)
 
"main" prio=6 tid=0x000000000264c800 nid=0x25a8 runnable [0x000000000296e000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
        at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
        at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
 
        at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
        - locked <0x00000000eb4b3d58> (a sun.nio.ch.Util$2)
        - locked <0x00000000eb4b3cd8> (a java.util.Collections$UnmodifiableSet)
        - locked <0x00000000eb4b3768> (a sun.nio.ch.WindowsSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(Unknown Source)
        at sun.nio.ch.SelectorImpl.select(Unknown Source)
        at tcp.selector.SelectorDeadLock.service(SelectorDeadLock.java:62)
        at tcp.selector.SelectorDeadLock.main(SelectorDeadLock.java:89)
 
"VM Thread" prio=10 tid=0x0000000008ef2800 nid=0x2a38 runnable
 
"GC task thread#0 (ParallelGC)" prio=6 tid=0x00000000024f3000 nid=0x2144 runnabl
e
 
"GC task thread#1 (ParallelGC)" prio=6 tid=0x00000000024f5000 nid=0x2344 runnabl
e
 
"GC task thread#2 (ParallelGC)" prio=6 tid=0x00000000024f6800 nid=0x2318 runnabl
e
 
"GC task thread#3 (ParallelGC)" prio=6 tid=0x00000000024f8800 nid=0x22c4 runnabl
e
 
"VM Periodic Task Thread" prio=10 tid=0x0000000008fb1800 nid=0x249c waiting on c
ondition
 
JNI global references: 125
 

 
 程序会一致阻塞而无法继续执行.
华为OD机试 - 天然蓄水库(Java 2025 A卷 100分) 例如,当山脉为s = [3, 1, 2]时,则选取s[0]和s[2]作为水库边界,则蓄水量为1,此时输出:0 2:1。选取下标 0(高度 3)与 2(高度 2)为边界,水位为 min(3,2)=2;选取山脉上两个点作为蓄水库的边界,则边界内的区域可以蓄水,蓄水量需排除山脉占用的空间。经过分析,选取s[1]和s[6]时,水库蓄水量为19(3 + 7 + 4 + 5)。当存在合理的水库边界时,输出左边界、空格、右边界、英文冒号、蓄水量;当山脉`s = [3, 2, 1]时,不存在合理的边界,此时输出:0。 阅读详情

相关推荐

ubuntu 20.04系统离线安装nfs

ubuntu环境下,离线安装nfs

m0_62464865的博客 2245

java nio在windows下的坑。导致CPU飙升

堆栈信息: "I/O dispatcher 16" #137 prio=5 os_prio=0 tid=0x000000002139f000 nid=0x58d0 runnable [0x000000002e58f000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) at sun.nio.ch.WindowsSelectorImpl$Sub

无能力者只知抱怨 4115

实用软件工程(第2版)吕云翔编简答题部分答案(自用整理)

整理自用

m0_61217768的博客 4109

NIO网络编程底层逻辑分析

背景 最近在复习Java NIO的网络编程部分,针对NIO的多路复用,产生了以下疑问: ServerSocketChannel如何被创建的 Selector是如何创建的 Channel注册到Selector上的背后,执行了哪些操作;注册的SelectionKey.OP_ACCEPT在哪里起到作用的 selector.select()为什么会阻塞 selector的selectKeys是如何被赋值的 SocketChannel是如何被创建的 基于以上疑问,写了一个Demo,单步调试详细了解NIO的网络编程

691

别再死记硬背Modbus报文了!用Python+Modbus Poll手把手教你调试工业设备

本文详细介绍了如何利用Python和Modbus Poll工具高效调试工业设备通信。通过实战案例和代码示例,帮助读者快速掌握Modbus通信协议的核心配置、数据监控技巧及Python自动化脚本编写,解决工业设备调试中的常见问题,提升工作效率。

weixin_42520780的博客 345

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3331

NIO[SelectableChannel.register和Selector.select会有锁等待冲突]

  结论: register得放在select之前进行 Thread Dump信息: "Poller-1" prio=6 tid=0x040f0400 nid=0x408 runnable [0x044df000]    java.lang.Thread.State: RUNNABLE         at sun.nio.ch.WindowsSelectorImpl$SubSele...

tianshilang的专栏 578

Elsevier投稿别再踩坑了!手把手教你搞定LaTeX模板和所有附件(附避坑清单)

本文详细解析Elsevier投稿全流程中的关键环节,特别是LaTeX模板的使用和系统提交的常见问题。从必备文件准备到LaTeX模板适配,再到投稿系统操作指南,提供全面的避坑清单和实用技巧,帮助科研工作者高效完成投稿,避免因格式错误或文件遗漏导致的退稿风险。

weixin_30915275的博客 552

Javanio的selector的register阻塞问题

今天上午打算实现一下将服务器的accept和read分开两个线程来处理,写了如下代码,结果发现程序阻塞在了accepthandler中的channel执行的register方法 package castest; import javax.sound.midi.Soundbank; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channel

qq_43147121的博客 1996

低轨通信 | 手机直连低轨卫星通信:架构、关键技术与未来展望

手机直连低轨卫星通信正推动人类进入"全域连接"时代。当中国星网GW星座与千帆星座的万颗卫星点亮夜空,当普通智能手机在珠峰之巅仍能流畅视频通话,当远洋渔船通过卫星物联网实现精准捕捞——这些场景不仅重构通信产业格局,更将深刻改变人类生产生活方式。正如工信部《指导意见》所规划,到2030年我国将发展超千万卫星通信用户,催生万亿级新市场[1][5]。在这场太空基建竞赛中,技术创新与标准制定的双重突破,将决定未来数字文明的星空版图。

尘世冰封的专栏 944

《低功耗方法学》翻译——第一章:介绍

第一章:介绍

记录所学,分享知识,结识挚友 2069

Selector select方法阻塞register的解决方法

Selector select方法阻塞register的解决方法

hezuideda的专栏 4654

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1170

Java IO模型BIO、NIO、AIO介绍

Java BlO就是传统的Java IO编程,其相关的类和接口在Java.io 包中BIO(blocking I/O)同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器).

liuhenghui5201的专栏 1488

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Windows中Java进程cpu爆满解决方法

因为公司业务需要部署在 windows 系统下运行,镜像版本是2019数据中心版,在部署测试时无任何接口调用,运行一段时间后 cpu 突然暴增至 100% 打下栈日志 jstack 10024 > c:/cdf.log 查询日志信息发现是Tomcat 抛出的异常 "http-nio-5010-ClientPoller" #34 daemon prio=5 os_prio=0 tid=0x0000000020a00800 nid=0x10ec runnable [0x0000000027.

weixin_50379782的博客 1275

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java NIO Selector(2)---Selector如何实现多路复用select-2

上一篇文章中描述了使用系统调用select返回指定fd的就绪的时间信息,然后在java层面利用SelectionKey等抽象概念来封装这些信息,来达到对上层提供简单灵活的接口,并屏蔽底层细节。 处理Select系统调用返回的信息 上层抽象Selector通过调用select方法,最终调用到WindowsSelectorImpl的doSelece方法,在doSe...

weixin_45701550的博客 378

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM高级特性与最佳实践-虚拟机性能监控与故障处理

本机上的java版本是jdk1.7.0_45,在bin目录下有很多的可执行程序,这些都是一些帮助编写java程序的工具 jps命令:我编写并运行一个HttpServer的java应用程序: 然后通过jps命令就可以看到当前运行的java应用程序进程 jstat:虚拟机统计信息监视工具: 比如jstat -gccapacity 6780就能监视java堆各个区

Android系统开发-VR OS-系统安全隐私 2792

selector多路复用_NIO入门之多路复用选择器Selector

简介Selector 是 java.nio.channels 包下的重要组件,阅读本文可以带你了解常用的 API。本文中把 Channel 翻译成信道,按照个人习惯也可以称作是通道、管道。Selector 的核心组件有 SelectableChannel、Selector、SelectionKey。多路复用选择器更多的是用在 Java 网络编程,网络编程的常用到就是 UDP / TCP 。Sele...

weixin_40009393的博客 217

SpringCloud - WebMvcConfigurer & @EnableFeignClients 冲突之 getApplicationContext() 为 null 解决(一)

在业务中,我们时常需要对 WebConfig 一些方法进行重构,那么不得不提到传统的方法:WebMvcConfigurerAdapter,但是我们都知道WebMvcConfigurerAdapter 已经过时了,替代方案有 2 个方法。 新的版本解决方案目前有两种 第一种:WebMvcConfigurer @Configuration public class WebConfg implements WebMvcConfigurer { } 第二种:WebMvcConfigura..

2440

Java线程和多线程(八)——Thread Dump

Java的Thread Dump就是列出JVM中所有激活状态的线程。 Java Thread Dump Java Thread Dump在分析应用性能瓶颈和死锁的时候,是非常有效的。 下面将介绍多种不同的方式来获取Java程序的Thread Dump信息。这些指令在*nix型的操作系统下是有效的,但是在Windows下面,采取的方式会有一些不同。(主要是Pid信息获取...

weixin_30518397的博客 434

技术自查第四篇:线程基础篇

前言 面试题中常见的题目之一,很多人都能解答出简单的线程问题。但往往面试官再深入,很多时候就哑口无言。同时线程也是我们开发中常用的,故我们必须要好好学习线程,深入了解原理。 要了解线程,请先记住以下这句话。 锁的机制:基于线程,不是基于方法 线程与进程的关系 https://www.zhihu.com/question/25532384 进程是资源最小调度单位,线程是进程最小调度单位,理论上一个进程可以有无数个线程。 进程之间互不影响,线程之间可以相互影响。 打个比喻: 系统=火车站

banbeisudashui的博客 963

《Java源码解析》之NIO的Selector机制(Part2:SelectableChannel.register(Selector sel, int ops))

通过上一篇博客,我们知道了Selector机制中的open()函数做了什么,其实也就是创建了一个管道,并把pipe的读写文件描述符放入pollArray中,这个pollArray是Selector的枢纽。下面我们抓取源码看一下channel在selector中注册时做了什么? SelectableChannel.register(Selector sel, int ops)SelectableCh

惜暮 3777

【Java】NIO中Channel的注册源码分析

不管是在服务端还是客户端,Channel的注册是在SelectableChannel中定义的: public abstract SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException; public final SelectionKey regis...

Z_ChenChen的博客 1003

[JAVA学习笔记-56]Selector

1、sc.register(selector,key) 注册的时机?       需要根据需要,不断变换SocketChannel关注的OP事件;  需要叠加 OPS的话,要用 | 或操作,而不能多次注册,多次注册只会覆盖;  OPS用一个byte保存,多次注册,只是把这个byte变量覆盖了,会导致前一个 OPS 失效(如果不重复的话)。   2、一方进程崩溃,另一方如何安全关闭?  

sinat_36263171的博客 335

NIO 源码浅析

一、前言 二、正文 1. Selector.open(); http://www.myexception.cn/program/1598318.html https://www.iteye.com/blog/goon-1775421 https://blog.youkuaiyun.com/u010412719/article/details/52809669

猫吻鱼的博客 958

【自己读源码】Netty4.X系列(三) Channel Register

Netty源码分析(三) 前提概要 这次停更很久了,原因是中途迷茫了一段时间,不过最近调整过来了。不过有点要说下,前几天和业内某个大佬聊天,收获很多,所以这篇博文和之前也会不太一样,我们会先从如果是我自己去实现这个功能需要怎么做开始,然后去看netty源码,与自己的实现做对比。 Server端NIO复习 Netty有基于很多IO的实现(...

weixin_34221276的博客 235
上一篇: FusionCharts制作实时刷新图
yklovejava
博客等级 码龄14年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值