当前位置: 首页 > 面试题库 >

线程限制

洪成济
2023-03-14
问题内容

我在实践中阅读Java Concurrency,并且有点与线程限制概念混淆。这本书说

当一个对象被限制在一个线程中时,即使该限制对象本身不是一个线程,这种使用也是自动的线程安全的

那么,当一个对象被限制在一个线程中时,没有其他线程可以访问它吗?那就是局限于线程吗?如何将对象限制在线程中?

编辑:
但是,如果我仍然想与另一个线程共享对象怎么办?假设在线程A完成对象O后,线程B想要访问O。在这种情况下,在A完成操作之后,O仍可以限制在B内吗?

当然,使用局部变量是一个示例,但这仅意味着您不与其他线程共享对象(全部)。对于JDBC连接池,一旦使用该连接完成线程,它就不会将一个连接从一个线程传递到另一线程(因为我从未使用过JDBC,所以对此一无所知)。


问题答案:

那么,当一个对象被限制在一个线程中时,没有其他线程可以访问它吗?

不,这是相反的方法:如果您确保没有其他线程可以访问某个对象,则可以说该对象被限制在单个线程中。

没有语言或JVM级别的机制可以将对象限制为单个线程。您只需要确保没有对该对象的引用转义到另一个线程可以访问的位置。有诸如类之类的工具可以 帮助避免
泄漏引用,ThreadLocal但是没有什么工具可以
确保 没有泄漏任何地方的引用。

例如:如果对对象的 唯一 引用来自局部变量,则该对象 肯定会 限制在单个线程中,因为其他线程永远无法访问局部变量。

同样,如果对一个对象的 唯一 引用来自另一个对象,该对象已被证明仅限于单个线程,则该第一个对象将被限制在同一线程中。

广告编辑:
实际上,您可以拥有一个对象,该对象只能在一个线程的生命周期内一次访问,但是单个线程会对此Connection对象进行更改(连接池中的JDBC
对象就是一个很好的例子)。

证明 ,这样的对象永远只能由一个线程访问比证明它对于用于局限于一个对象更难 但其整个生命过程中的线程。

在我看来,这些对象从未真正被“限制在单个线程中”(这意味着有力保证),而可以说“仅一次被单个线程使用”。



 类似资料:
  • 所以我们有一些游戏服务器在我们的V服务器上运行(我说的这款有8Vcore、4.2GHz和32GB DDR4内存),例如Minecraft。我们的问题是服务器在大约640个线程的情况下耗尽了内存(它不关心栈大小,1024KB、512KB都是相同的结果)。那么有没有办法从我们的系统中得到更多的线程呢? Linux:Debian 9 Virtuozzo容器 Java: openjdk版本“1.8.023

  • 我正在尝试创建一个具有一定数量线程的ThreadPoolExector,但同时,我想控制池队列的大小。所以我使用完整的构造函数创建了执行器: 然而,这给了我一个非法辩论例外。如果我将构造函数更改为 它起作用了。如果我希望理想的线程数和最大线程数相同,为什么它不起作用呢。

  • 问题内容: 基本上我需要在更多线程中运行〜数百个计算。我只想在paralell中运行一些并行线程,例如5个线程和5个计算。 我正在使用spring框架,@Async选项是自然选择。我不需要全功能的JMS队列,这对我来说有点麻烦。 有任何想法吗 ?谢谢 问题答案: 你检查了吗?你可以定义一个线程池,其中包含最大数量的线程来执行任务。 如果要与结合使用,请在spring-config中使用它:

  • 我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

  • 我有一个tomcat服务器,可以处理一些rest API请求。这个tomcat崩溃是由于某些输入中的一个特定rest请求内存不足导致的,这会导致大量堆大小的使用,从而导致所有站点崩溃。 我想限制这个Rest请求内存使用我怎么能做到呢?我通常想保护tomcat免受大内存使用请求崩溃的影响。我怎么能做到呢?也许以某种方式限制所有线程最大堆大小?

  • 我正在使用Pircbot创建一个IRC bot,它可以响应某些请求(例如“!time”提供本地时间)。我正在构建的功能之一是一个giveaway系统,从当前在线的用户中随机抽取一个用户,给他们一个奖品。 我想通过强制中奖者在中奖后30分钟内键入“!接受”来领取奖品来增强系统。然而,我希望bot仍然运行,这意味着我不能冻结整个线程30分钟等待一个消息。 我想做的几种方法对我来说有点太古怪了。 > 我