2011-09-08 5 views
2

문자열에 따라 동기화 알고리즘을 구현해야합니다. 두 스레드가 동기화되어야하고 스레드 쌍이 문자열 값 (문자열 A에 대한 스레드 한 쌍, 문자열 B에 대한 한 쌍의 쌍)에 의존한다는 것을 의미합니다.Objective C에서 Java에서 intern()을 사용하는 경우

자바에서는 두 인 스레드가 공유하는 단일 잠금 개체를 얻기 위해 intern 메서드를 사용하여 알고리즘을 구현할 수있었습니다. Java는 jvm 내장 풀에서 모든 litteral을 가져오고 interne는 동적으로 생성 된 문자열을 풀의 litteral로 변환합니다.

나는 이해했다 there is also a pooling mechanism in Objective C.

하지만 Java에서 intern()과 동일한 기능을합니다. 즉, 일반 String을 문자열 상수 풀에서 litteral String으로 변환하는 방법입니다. 이 두 문자열이 동일한 객체에 동기화되도록이 고유 한 String litteral에 대한 참조를 얻으려면.

나는 약간의 문제가 있음을 알고 있지만, 나는 그것들이 피하고자하는 많은 String 비교를 함축하고있다. (비록 인턴이 최선을 다하지만 최선의 방법이라고 생각한다.)

좀 더 일반적인 용어로 내 문제를 설명하려면 : String을 잠금에 매핑하는 Dictionnary를 피하고 싶습니다. 자바는 String litteral (풀링 된)이 자물쇠가 될 것이므로 인턴 덕분에 그렇게 할 수 있습니다. 어떤지도가 있습니까? 아니면이지도를 사용해야합니까?

감사합니다 여러분, 스테판

+1

문자열 리터럴을 통해 동기화하는 것이 좋습니다. 문자열 변수 OK를 통해,하지만 리터럴에, 나는 모르지만 ...하지만 어쩌면 내가 틀렸다. –

+2

상위 목표가 무엇인지 설명하는 것이 좋습니다. 일반적인 관점에서 무엇을 달성하고 싶습니까? 귀하의 질문은 Objective-C/Cocoa의 다른 방법을 통해 더 잘 해결 될 수있는 문제에 대해 매우 구체적인 해결책을 가지고있는 것처럼 들립니다. – DarkDust

+0

이 끝에 업데이트되었습니다. – Snicolas

답변

2

마침내 모든 문자열을 조건부 잠금에 바인딩하는 사전을 사용했습니다.

감사합니다 그게 당신이 찾고있는 잠금을 생성하는 가장 좋은 방법이지만, 여기 당신이 원하는 효과를 줄 수있는 작은 해킹을 알리는없이 모든

2

나는 Java 및 목표 - C 모두에서 정기적으로 프로그램.

먼저 설명하는 내용이 자물쇠를 공유하는 방법이 아닌 것 같습니다. 그것은 까다 롭고 부서지기 쉽기 때문에 String international이 어떻게 작동하는지에 대해 친숙하지 않은 다른 코더들을 혼란스럽게 할 것입니다. 한 클래스의 잠금 객체를 상수로 다른 객체에 노출시키지 않는 이유는 무엇입니까?

public class Foobar { 

    public static final Object LOCK = new Object(); 

    public void doLockedStuff() { 
     synchronized (LOCK) { 
      // code here 
     } 
    } 

} 

public class Barfoo { 
    public void doLockedStuff() { 
     synchronized (Foobar.LOCK) { 
      // code here 
     } 
    } 
} 

그리고 나서 공유 LOCK 객체를 노출하는 클래스 메소드 인 Objective-C에서 유사한 접근 방식을 채택 할 수 있습니다.

+0

잘 문서화되어있는 한 모든 좋은 해결책이 실제로 유효하다고 믿습니다. – Snicolas

+0

이 접근법은 질문과 관련이 없습니다. – Snicolas

+0

인턴 된 String을 사용하는 것이 Java 또는 Objective-C에서 잠금에 적합하지 않다고 생각합니다. 대신 잠금을 위해 특별히 생성 된 공유 객체를 사용해야합니다. –

2

문자열을 나타내는 잠금을 매핑하는 것이 가장 좋은 방법이라고 생각합니다.

String 자체 (또는 인턴 된 버전)는 JVM의 공유 객체이기 때문에 잠글 필요가 없습니다. JVM의 다른 구성 요소가 동일한 작업을 수행하는지 여부는 알 수 없으므로 교착 상태가 발생할 수 있습니다.

Java Concurrency in Practice에 대해 더 잘 설명되어 있지만 지금은 참조를 찾을 수 없습니다.

문자열이 변경되지 않고 문자열의 해시 코드가 한 번만 계산되어야하기 때문에 HashMap을 사용하면 잠금을 포함하는지도가 큰 성능 문제를 일으키지 않습니다.

2

:

NSString *stringA = [NSString stringWithString:@"Hello"]; 
NSString *stringB = [NSString stringWithFormat:@"%@l%@",@"Hel",@"o"]; 
NSString *stringC = [NSString stringWithFormat:@"Hell%@", @"o"]; 

NSLog(@"%p/%p/%p", stringA, stringB, stringC); 

NSNumber *lockA = [NSNumber numberWithUnsignedInteger:stringA.hash]; 
NSNumber *lockB = [NSNumber numberWithUnsignedInteger:stringB.hash]; 
NSNumber *lockC = [NSNumber numberWithUnsignedInteger:stringC.hash]; 

NSLog(@"%p/%p/%p", lockA, lockB, lockC); 

당신은 알이 그 문자열은 다른 주소를 가지고 있지만, 해당 NSNumber는 그렇지 않습니다. 주어진 숫자에 대한 NSNumbers가 싱글 톤이기 때문입니다.

이제 이러한 "잠금"개체에 @synchronize()을 사용할 수 있습니다.

- 편집 -

NSNumbers가 주어진 값에 대한 싱글이 사실이 실제 잠금 장치를 물색하는 좋은 생각이 될 수있는 이유 중 하나 구현에 내부 세부입니다 예를 들어 NSString으로 색인화 된 사전과 같이.

+0

최종 댓글 +1 +1 – Snicolas

+0

두 문자열의 해시가 같을 수 있습니다. – user102008