Sobes.tech
Middle

Se poate aplica sincronizarea (synchronized) la o variabilă?

sobes.tech AI

Răspuns de la AI

Nu, cuvântul cheie synchronized nu există în Swift. Pentru sincronizarea accesului la variabile în medii multi-thread, se folosesc alte mecanisme:

  • Cozi de dispatch: Cozile seriale permit executarea blocurilor de cod în mod secvențial, garantând că doar un fir de execuție lucrează cu variabila în acel moment.

    // Coadă serială pentru sincronizare
    let queue = DispatchQueue(label: "com.myapp.syncQueue")
    
    var sharedVariable = 0
    
    func updateSharedVariable() {
        queue.sync {
            // Acces sincron la variabilă în interiorul cozii
            sharedVariable += 1
            print(sharedVariable)
        }
    }
    
  • NSLock/NSRecursiveLock: Permite blocarea accesului la o secțiune de cod.

    import Foundation
    
    let lock = NSLock()
    var sharedArray = [Int]()
    
    func addToSharedArray(value: Int) {
        lock.lock() // Blocarea mutex-ului
        sharedArray.append(value)
        print("Adăugat: \(value). Array: \(sharedArray)")
        lock.unlock() // Eliberarea mutex-ului
    }
    
  • Operații și Cozi de Operații: Oferă o modalitate de nivel înalt de a gestiona sarcini paralele, inclusiv dependențe și priorități.

  • @synchronized (Objective-C): În Objective-C exista un mecanism similar, dar nu este disponibil direct în Swift și necesită utilizarea de punți cu Objective-C. Se recomandă utilizarea soluțiilor native Swift (Dispatch Queues, Locks).

Alegerea mecanismului depinde de natura sarcinii. Cozile de dispatch sunt adesea cea mai convenabilă și eficientă metodă pentru sincronizarea simplă a accesului la date.