首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全对象池,此对象池线程安全吗?

线程安全对象池,此对象池线程安全吗?
EN

Code Review用户
提问于 2013-08-11 08:57:42
回答 2查看 863关注 0票数 1

如果许多线程借用()并将数据包的实例从/返回到PacketPool,那么Packet.Init()中的异常会被抛出吗?假设只有PacketPool调用包上的Init()和UnInit()方法。

代码语言:javascript
复制
class PacketPool
{
    private Stack<Packet> pool;

    public PacketPool(int initalNum)
    {
        pool = new Stack<Packet>(initalNum);

        for (int i = 0; i < initalNum; i++)
        {
            Packet p = new Packet();
            pool.Push(p);
        }
    }

    public Packet Borrow()
    {
        Packet p;

        lock (pool)
        {
            if (pool.Count == 0)
            {
                p = new Packet();
            }
            else
            {
                p = pool.Pop();
            }
        }

        p.Init();

        return p;
    }

    public void Return(Packet p)
    {
        p.UnInit();

        lock (pool)
        {
            pool.Push(p);
        }
    }
}

class Packet
{
    bool isInitialized;

    public void Init()
    {
        if(isInitialized)
            throw new InvalidOperationException("Already initialized!");
        isInitialized = true;
    }

    public void UnInit()
    {
        isInitialized = false;
    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2013-08-11 12:33:45

假设只有PacketPoolPacket上调用了Init()UnInit()方法。

我觉得这不是你应该做的假设。如果您的代码的用户不应该调用某些方法,那么不要让他这样做,不要仅仅假设他不会。

您可以做的是将不包含这两个方法的外观返回到Packet,而不是直接返回Packet

票数 2
EN

Code Review用户

发布于 2013-08-11 09:57:16

不,永远不会抛出Packet.Init()中的异常。这是因为尽管the ()中可能有多个线程,但lock语句将确保每个线程都看到自己版本的p。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/29606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档