Sobes.tech
Middle

Lze na proměnnou použít synchronizaci (synchronized)?

sobes.tech AI

Odpověď od AI

Ne, klíčové slovo synchronized v Swiftu neexistuje. Pro synchronizaci přístupu k proměnným v prostředích s více vlákny se používají jiné mechanismy:

  • Dispatch fronty: Sériové fronty umožňují provádět bloky kódu sekvenčně, zajišťující, že pouze jedno vlákno pracuje s proměnnou v daný okamžik.

    // Sériová fronta pro synchronizaci
    let queue = DispatchQueue(label: "com.myapp.syncQueue")
    
    var sharedVariable = 0
    
    func updateSharedVariable() {
        queue.sync {
            // Synchronní přístup k proměnné uvnitř fronty
            sharedVariable += 1
            print(sharedVariable)
        }
    }
    
  • NSLock/NSRecursiveLock: Umožňují zablokovat přístup do sekce kódu.

    import Foundation
    
    let lock = NSLock()
    var sharedArray = [Int]()
    
    func addToSharedArray(value: Int) {
        lock.lock() // Zamknutí mutexu
        sharedArray.append(value)
        print("Přidáno: \(value). Pole: \(sharedArray)")
        lock.unlock() // Odblokování mutexu
    }
    
  • Operace a fronty operací: Nabízejí vysoceúrovňový způsob správy paralelních úkolů, včetně závislostí a priorit.

  • @synchronized (Objective-C): V Objective-C existoval podobný mechanismus, ale není přímo dostupný ve Swift a vyžaduje použití mostů s Objective-C. Doporučuje se používat nativní řešení Swift (Dispatch Queues, Locks).

Výběr mechanismu závisí na povaze úkolu. Dispatch fronty jsou často nejpohodlnějším a nejefektivnějším způsobem pro jednoduchou synchronizaci přístupu k datům.