Sobes.tech
Middle

Kan synchronisatie (synchronized) op een variabele worden toegepast?

sobes.tech AI

Antwoord van AI

Nee, het sleutelwoord synchronized bestaat niet in Swift. Om toegang tot variabelen in multithread-omgevingen te synchroniseren, worden andere mechanismen gebruikt:

  • Dispatch-Queues: Seriële queues laten toe codeblokken sequentieel uit te voeren, waardoor gegarandeerd wordt dat slechts één thread op dat moment met de variabele werkt.

    // Seriële queue voor synchronisatie
    let queue = DispatchQueue(label: "com.myapp.syncQueue")
    
    var sharedVariable = 0
    
    func updateSharedVariable() {
        queue.sync {
            // Synchrone toegang tot de variabele binnen de queue
            sharedVariable += 1
            print(sharedVariable)
        }
    }
    
  • NSLock/NSRecursiveLock: Stellen het blokkeren van toegang tot een code-sectie mogelijk.

    import Foundation
    
    let lock = NSLock()
    var sharedArray = [Int]()
    
    func addToSharedArray(value: Int) {
        lock.lock() // Mutex vastleggen
        sharedArray.append(value)
        print("Toegevoegd: \(value). Array: \(sharedArray)")
        lock.unlock() // Mutex vrijgeven
    }
    
  • Operaties en Operation Queues: Bieden een hoog-niveau manier om parallelle taken te beheren, inclusief afhankelijkheden en prioriteiten.

  • @synchronized (Objective-C): In Objective-C bestond een vergelijkbaar mechanisme, maar het is niet direct beschikbaar in Swift en vereist het gebruik van bruggen met Objective-C. Het wordt aanbevolen om Swift-native oplossingen te gebruiken (Dispatch Queues, Locks).

De keuze van mechanisme hangt af van de aard van de taak. Dispatch Queues zijn vaak de meest handige en efficiënte manier voor eenvoudige synchronisatie van gegevenstoegang.