2017-12-20 16 views
0

에서 나는 여러 스레드에 의해 작성된 널 (NULL) 변수가있는 클래스,이에 대응하기 위해동시성 코 틀린

class A { 
    var s: String? = null //var accessed by multiple threads 

    fun doStuff() { 
     if (s != null) { 
      //not safe 
     } 
    } 
} 

같은 것을, 나는 보통 이렇게

class A { 
    var s: String? = null //var accessed by multiple threads 

    fun doStuff() { 
     val sCopy = s 
     if (sCopy != null) { 
      //safe now 
     } 
    } 
} 

같은 불변의 복사본을 만들 수 있습니다 휘발성, 동기화 된 등의 동시성 도구에 대해 읽었지 만 멀티 스레딩을 잘 수행하지 못했지만 어떻게 처리해야하는지 알고 있으며 불변 값을 만드는 것보다 달성 할 수있는 더 좋은 방법이 있다고 확신합니다. 어떻게할까요? ?

+0

분명히하기 위해, 내부 블록이 두 경우 모두's'에 쓰기를 수행하고있는 것입니까? –

+0

@OliverCharlesworth 아니요 – user3491043

+0

오, 그렇다면 글이 어디에서 발생합니까? FWIW는'synchronized'를 사용하여 아마 여기에 무차별 대치 솔루션입니다. –

답변

0

우선 Kotlin과 관련이 없습니다. 이러한 경우 Kotlin을 단순히 재사용 할 수 있기 때문입니다.

사실 항상 상태에 발생하는 것에 따라 (특별한 경우 s) 정확하게 달라집니다. 대부분의 간단한 경우에 자물쇠으로 사용되며 해당 상태에 대한 모든 단일 액세스에 대해 해당 자물쇠를 사용하는 객체 (모든 유형이 될 수 있음)를 만듭니다.

val lock = Any() 
synchronized(lock){ 
    //safe now 
} 

는 마지막으로, 코드 val sCopy = s는 단순히 같은 객체에 대한 두 번째 변수를 가리키는 것, s의 카피입니다; 이 코드는 더 안전하지 않습니다.

+0

Java와 비교할 때이 '동기화 된'방법이 상용구를 줄이는 방법에 대해서는 조금 혼란 스럽습니다. 언어 기능이 아닌 라이브러리 기능으로 표현할 수 있다는 것은 좋은 일입니다. – chris

0

당신은 쓰기 모두를 잠글 필요하고,이 같은, 당신의 변수에 읽

class A { 
    var s: String? = null //var accessed by multiple threads 
    set(s) { 
     synchronized(this) { 
      field = s 
     } 
    } 

    fun doStuff() { 
     synchronized(this) { 
      //safe now  
     } 
    } 
} 

당신은 그렇지 않으면 값이 스레드가 doStuff에있는 동안 덮어 쓸 수 있습니다 beacuse 세터 동기화해야합니다.

일반적으로 여러 스레드가 동일한 변수를 쓸 수있는 상황을 피하는 것이 좋습니다.