1

是什么synchronized

它是干什么用的?

synchronizedjava和objective-c有什么区别@synchronized

4

2 回答 2

5

从一个以上的独立线程并发访问一个对象总是在所有编程语言中提出一组一致的问题,并且Java也不Objective-C例外。为了帮助解决这些问题,两种语言都支持所谓的synchronized指令。任何标有该synchronized指令的代码块都受到保护,在任何时候都不会有一个以上的线程执行它。

Synchronized用于使代码块线程安全。它使得在任何给定时间只有一个线程可以执行该代码块。

两种语言之间以及它们如何使用synchronized指令实际上并没有太多区别。唯一的主要区别是 in Java,synchronized实际上是 akeyword并且可以用作方法修饰符。而要完成等效操作,Objective-C您必须@synchronized(self)在方法中最外层的代码块上使用。除了这些小限制之外,您还可以像在 java 中一样@synchronized使用。为了说明这些细微差别并展示如何使用以下示例来保存代码线程。Objective-Csynchronizedsynchronized

爪哇

public class MyThreadSafeExample {
    public synchronized void safeMethod() {
        // Here you would enter the code you want to be thread safe.
    }
}

Objective-C

@interface MyThreadSafeExample : NSObject

- (void)safeMethod;

@end

@implementation MyThreadSafeExample

- (void)safeMethod
{
    @synchronized(self) {
        // Here you would enter the code you want to be thread safe.
    }
}

@end

请注意,除了明显的语法差异外,两者之间没有任何巨大差异,并且两者的行为方式完全相同。

另请注意,在Java中,您可以使其看起来更像Objective-C,执行以下操作

public class MyThreadSafeExample {
    public void safeMethod() {
        synchronized (this) {
            // Here you would enter the code you want to be thread safe.
        }
    }
}

请注意,它不再是方法修饰符,但它们仍然会做完全相同的事情并使代码块线程安全,并且两个Java版本基本相同。

于 2013-08-16T16:06:39.397 回答
5

在高层次上,两者都可以被描述为“确保一次只有一个执行线程正在执行一段代码的机制”。也就是说,它们使代码范围成为原子的;一次只能从一个线程执行。

虽然这使执行线程安全,但它不会使程序线程安全。原子性并不能保证线程安全。 原子属性和非原子属性有什么区别?

注意:它们几乎相同也就不足为奇了。Java 是作为 Objective-C 的直接派生而创建的。

一个区别:在 Java 中,synchronized应用于方法的关键字会影响任何一个实例上该类的所有方法。您不能让一组方法在 state 上同步,A而另一组方法在 state 上同步B。Objective-C 没有这种形式。

Objective-C 和 Java 也都有一个@synchonized(ARG) { ... }(Java 放弃@)构造,通过在执行所述范围期间{ ... }持有一个锁定的锁来序列化ARG范围(其中同时执行所述范围的第二次执行将阻塞直到完成)。

因此,您可以在任何一个类中,甚至跨类中拥有许多不同的序列化网关。

例如,如果您有一个带有可变数组实例变量的类,您可以:

- (void)swap {
     @synchonized(_mutableArray) {
          ... swap some elements here ...
     }
 }

 - (void)sort {
     @synchonized(_mutableArray) {
          ... sort some elements here ...
     }
 }

您可以在一个方法中混合@synchronized()范围:

- (void)thisIsntAGoodIdeaButJustAnExample
     @synchonized(_mutableArray) {
          ... sort some elements here ...
          @synchronized(self) {
              ... some operation that requires both _mutableArray and self to be locked ...
          }
     }
 }

您也可以使用@synchronized([SomeClass class]) { ... }@synchronized(someGlobal) { ... }

于 2013-08-16T16:21:10.203 回答