使用@synchronized(self)会带来多少开销?

3

我一直在为我的iPhone应用程序编写一个对象类,当另一个部分首次请求它们时,它会延迟加载图像。我决定使图像的加载线程安全,以防止同一图像被意外加载两次,但我对每次运行访问器时都进行@synchronized(self)调用的开销感到好奇:

- (UIImage *)image
{
    @synchronized(self)
    {
        if (_image == nil)
        {
            _image = [UIImage imageWithContentsOfFile:self.imageUrl];
        }
    }
    return _image;
}

首先检查属性是否为nil,然后再使用@synchronized指令是否更好?

- (UIImage *)image
{
    if (_image == nil)
    {
        @synchronized(self)
        {
            if (_image == nil)
            {
                _image = [UIImage imageWithContentsOfFile:self.imageUrl];
            }
        }
    }
    return _image;
}

有什么想法吗?
2个回答

4

开销很小,但加载图像的开销可能很大,因此将其包围在同步原语中意味着任何在其上阻塞的内容都可能付出代价...


2

首先,UIKit不是线程安全的,所以你需要小心处理。其次,UIImage会自行进行一些缓存,因此如果你只是从磁盘加载,则只需使用UIImage imageNamed:。

但是,我猜想你可能正在从网络中加载图像,在这种情况下,你可以使用performSelectorOnMainThread:。然而,如果你只是使用NSURLConnection实现了一个简单的下载,所有工作都在主运行循环中完成,因此你不需要多线程。


谢谢提供信息!我的问题更多是关于@synchronized标签而不是其他方面。我只是在想它的开销。 - Jo-el

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接