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

如何让一个非线程安全的第三方库真正做到线程安全?

邓开济
2023-03-14

我有一个第三方图书馆提供一个类。他们的文件说:

我做了一些测试,创建了100个线程。实际上,如果我将同一个对象传递给所有100个线程,就会出现线程安全问题,但如果每个线程都创建自己的类实例,这些问题就会消失。

我在这里使用的是.NET4.0。在我的应用程序中,有多个线程想要使用这个类,但是我不想创建和销毁超过必要的对象(它们应该在应用程序的生存期内存在),所以我希望每个线程都有一个。这是否适合使用ThreadLocal 类?如果没有,处理这件事的标准方法是什么?

编辑:

共有1个答案

宗啸
2023-03-14

假设您根本不需要对象之间进行交互,ThreadLocal 在这里是一个非常好的选择。如果在一个线程中进行的修改是为了在另一个线程中看到,那么这显然是不起作用的,只是安全而已。

是的,它将为每个线程创建一个对象--但是除非创建对象的成本非常高,否则您可能会拥有数百个实例,这在大多数情况下是绝对不错的。

这方面的一个典型示例是system.random:

    null

因此您可以执行以下操作:

public static class RandomProvider
{
    private static readonly Random seedProvider = new Random();

    private static readonly ThreadLocal<Random> threadLocal =
        new ThreadLocal<Random>(InitializeNewRandom);

    public static Random GetRandomForThread()
    {
        return threadLocal.Value;
    }

    private static Random InitializeNewRandom()
    {
        lock(seedProvider)
        {
            return new Random(seedProvider.Next(int.MaxValue));
        }
    }
}

另一种方法是编写一个线程安全的代理类,它对每个操作都使用锁定--但如果您有多个操作希望“原子式”执行(即不交错其他调用),那么这仍然有问题。

 类似资料:
  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 我最近一直在和这部剧合作!框架和Nashorn,试图呈现Redux应用程序。最初,我在ThreadPoolExecutor中实现了多个Nashorn引擎,并在运行。性能很差,我想是因为我使用的是高I/O和阻塞未来。 在更加熟悉游戏之后!还有他们的异步/promise模式,我试图用一个

  • 问题内容: 我在这里谈论基本用法: 谷歌搜索以上问题,说是,但不是 -接受的答案是,是,但后续行动是否;Spring.io表示是和否,并且似乎是Java EE专家的Adam Bien给出了不合格的yes。 我对一个简单的调度bean的经验表明答案是否定的: 抽象界面: 开始于: 如果我打印出,即使我在两次调用之间仍在同一线程上,也会得到: 严重:java.lang.IllegalStateExce

  • 本文向大家介绍如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?,包括了如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?的使用技巧和注意事项,需要的朋友参考一下 StringBuffer(线程安全) StringBuffer是线程安全的,这意味着它们具有同步方法来控制访问,因此一次只有一个线程可以

  • 问题内容: 我经常听到对Swing库中缺乏线程安全性的批评。但是,我不确定自己将在自己的代码中执行的操作会导致问题: 在什么情况下,Swing不是线程安全的事实起作用? 我应该积极避免做什么? 问题答案: 切勿执行长时间运行的任务以响应按钮,事件等,因为这些事件在事件线程上。如果您阻止事件线程,则整个GUI将完全无响应,从而使用户感到非常生气。这就是为什么Swing看起来缓慢又硬朗。 使用线程,执

  • 本文向大家介绍如何保证线程安全?相关面试题,主要包含被问及如何保证线程安全?时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程 通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上可以通过适当的策略,保证任务与任务之间不存在共享资源,设计一个规则来保证一个客户的计算工作和数据访问只会被一个线程或一台工作机完成,而不是把一个客户的计算工作分配给多个线程去完成。