栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中的扫描器不是线程安全的吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的扫描器不是线程安全的吗?

如果您在两个线程中使用同一Scanner实例,则除非同步对对象的访问,否则将遇到麻烦。但是,两个单独的Scanner实例将永远不会相互干扰。

编辑以回应评论,询问如何同步

首先,您真的确定需要完全同步吗?您可以安全地在不同线程中使用不同的扫描仪实例,而不会造成任何危险。一个线程可以拥有

Scanner s1 = new Scanner (new File ("/tmp/file1.txt");

而另一个线程可以拥有
Scanner s2 - new Scanner (new File ("/tmp/file2.txt"));

并且没有风险。不同的扫描仪可以使用相同的文件,不同的文件或完全不同的数据源。不过,您仍然需要保持谨慎。如Stephen
C所述,如果两个单独的Scanner实例使用相同的流或读取器作为输入,则仍然会中断操作,它们将相互窃取字符。此警告适用于使用InputStream,Readable和ReadableByteChannel的构造函数。


在多个线程中使用单个扫描仪的问题在于,它顺序消耗了单个来源的字符。如果您有多个线程以不同步的方式使用这些字符,则每个线程将获得一些字符,而没有一个线程将获得所有字符。举例说明:假设您有一个扫描程序读取字符串“
qwertyuiop”,并且两个单独的线程同时调用函数

next()
,那么一个线程可能会看到“ ertip”,而另一个线程将得到“
qwyuo”;这将是无用的。

我的同步建议是:

  1. 不要多线程!甚至肢体截肢也比试图使多线程应用程序稳定,可扩展和灵活更可取!
  2. 有时候,你也可以继承一个非线程安全类(或封装和委托)和同步调用基类(或代表):
    synchronised (this) { super.next (); }
    。但是,请勿尝试使用Scanner!消费者方法太多了,您不知道该类是如何在内部实现的,所以注定要失败!见建议1。
  3. 我在这里尝试做的是让一个线程运行Scanner,并将令牌馈入ArrayBlockingQueue。这样,您将获得完整的令牌,以正确的顺序进入队列。您可以从队列中读取任意多个线程。但是请注意,除非小心处理满空条件,否则任何线程都可能会被阻塞,无法读取或写入此队列。很有可能,无论您做什么,都将以永远无法完成的悬空线程结束。看点1,这将让复杂,如果你想打电话,有时不同的 下一个 方法(例如
    nextInt()
    nextDouble()
    ),或使用 方法(例如
    hasNextInt()
    hasNextDouble()
    ),但不是那样复杂点2。

最后,我建议您看一下第1点。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/570126.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号