2013-08-16 1 views

답변

5

독립적 인 스레드에서 개체를 동시에 액세스 할 경우 항상 모든 프로그래밍 언어에서 일관된 문제 집합이 표시되고 JavaObjective-C은 예외가 아닙니다. 이러한 문제를 해결하기 위해 두 언어 모두 synchronized 지시문을 지원합니다. synchronized 지시문으로 표시된 모든 코드 블록은 아무 때 나 실행중인 스레드보다 보호됩니다.

Synchronized은 코드 스레드 안전을 위해 사용됩니다. 따라서 한 번에 하나의 스레드 만 해당 코드 블록을 실행할 수 있습니다.

실제로 두 언어간에 차이점이 없으며 그들이 synchronized 지시문을 사용하는 방법은 다릅니다. 유일한 차이점은 Java에서 synchronized은 실제로는 keyword이며 메서드 수정 자로 사용할 수 있습니다. Objective-C에서 동등한 결과를 얻으려면 메서드에서 가장 바깥 쪽 블록에 @synchronized(self)을 사용해야합니다. 이러한 사소한 제한을 넘어서는 경우와 마찬가지로 을 Objective-C에 넣을 수 있습니다. 이는 java에있는 synchronized과 완전히 같습니다. 이러한 사소한 차이점을 설명하고 synchronized을 사용하여 코드 스레드를 저장하는 방법을 보여 보려면 아래 예제를 참조하십시오. 명백한 구문 차이가있는 것을 제외하고 두 및이 두 사이에 큰 차이가 역할을하지 않는 것이

자바

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

목표 - 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 

공지 사항 정확히 같은 방식으로

주뿐만 아니라 자바당신이 더 이상 방법을 수정하지만, 그들 모두는 여전히 할 것 다음

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

통지를하지 않는 것이 더 목표 - C처럼 보이게 할 수 똑같은 일을하고 코드 블록 스레드를 안전하게 만들고 모두 Java 버전은 기본적으로 동일합니다.

5

높은 수준에서 둘 다 "한 번에 하나의 실행 블록 만 코드 블록을 실행하도록하는 메커니즘"이라고 할 수 있습니다. 즉, 코드의 범위를 원자화합니다. 한 번에 하나의 스레드에서만 실행 가능합니다.

실행을 스레드 안전으로 만들지 만 프로그램을 스레드로부터 안전하게 보호하지는 못합니다. Atomicity는 스레드 안전성을 보장하지 않습니다. What's the difference between the atomic and nonatomic attributes?

참고 : 거의 동일하다는 것은 놀랄 일이 아닙니다. 자바는 Objective-C의 직접적인 파생물로 만들어졌습니다.

하나의 차이점 : Java에서는 메소드에 적용되는 synchronized 키워드가 해당 인스턴스의 모든 클래스 메소드에 영향을줍니다. 하나의 메서드 집합을 상태 A에서 동기화하고 다른 메서드 집합을 상태 B에서 동기화 할 수 없습니다. Objective-C에는이 형식이 없습니다.

모두 오브젝티브 C 및 자바도가 @synchonized(ARG) { ... } 구조체 상기 범위의 실행 중에 ARG 키잉 잠금 (길게 범위 { ... } 직렬화 (자바는 @ 방울)이 상기 범위를 동시에 완료 될 때까지 차단 상기 제 2 실행).

따라서 하나의 클래스 내에서 또는 여러 클래스에서 여러 가지 다른 직렬화 게이트웨이를 가질 수 있습니다. 예를 들어

, 당신은 변경 가능한 배열 인스턴스 변수와 클래스가있는 경우, 당신 수 :

- (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) { ... }.