Синхронизация потоков — это механизм координации доступа к общим ресурсам в многопоточной среде, который предотвращает возникновение проблем при параллельном выполнении кода.
Предотвращение Race Conditions (состояний гонки)
var counter = 0
// Без синхронизации (опасно!)
repeat(1000) {
thread {
counter++ // Может потерять обновления
}
}
Обеспечение атомарности операций
@Synchronized
fun transferMoney(from: Account, to: Account, amount: Int) {
from.balance -= amount
to.balance += amount // Обе операции выполняются как единое целое
}
Некорректное состояние объекта
Видимость изменений между потоками
@Volatile // Или synchronized для гарантии видимости
var isDataLoaded = false
Кэширование данных
class ImageCache {
private val cache = mutableMapOf<String, Bitmap>()
private val lock = Any()
fun getImage(url: String): Bitmap? {
synchronized(lock) {
return cache[url]
}
}
fun putImage(url: String, bitmap: Bitmap) {
synchronized(lock) {
cache[url] = bitmap
}
}
}
Работа с SharedPreferences
apply()
нужна синхронизация при чтении-изменении:fun incrementCounter() {
synchronized(this) {
val count = prefs.getInt("counter", 0)
prefs.edit().putInt("counter", count + 1).apply()
}
}
Корутины с Mutex
private val mutex = Mutex()
var sharedState = 0
suspend fun updateState() {
mutex.withLock {
sharedState++ // Потокобезопасное изменение
}
}
Потокобезопасные коллекции
val concurrentMap = ConcurrentHashMap<String, Data>()
// Не требует явной синхронизации для большинства операций
Atomic переменные
val atomicCounter = AtomicInteger()
fun increment() {
atomicCounter.incrementAndGet() // Атомарная операция
}
Минимизация блокировок
Использование неизменяемых объектов
data class ImmutableData(val value: Int) // Потокобезопасен по умолчанию
Избегание deadlock-ов
синхронизация потоков необходима для корректной работы с общими ресурсами в многопоточной среде. В Android разработке важно выбирать подходящий механизм синхронизации (synchronized, Mutex, атомарные операции) в зависимости от конкретного сценария, балансируя между безопасностью и производительностью.