update And Fetch
Платформа и требования к версии: Common (2.2)
expect inline fun AtomicInt.updateAndFetch(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого атомарного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
На платформах, не поддерживающих многопоточность (JS и Wasm), эта операция реализована тривиально, и transform будет вызвана ровно один раз.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
expect inline fun AtomicLong.updateAndFetch(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
Это может произойти, например, если значение этого атомарного длинного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
На платформах, не поддерживающих многопоточность (JS и Wasm), эта операция реализована тривиально, и transform будет вызвана ровно один раз.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
expect inline fun <T> AtomicReference<T>.updateAndFetch(transform: (T) -> T): T
Атомарно обновляет значение этого AtomicReference значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этой атомарной ссылки было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
На платформах, не поддерживающих многопоточность (JS и Wasm), эта операция реализована тривиально, и transform будет вызвана ровно один раз.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
data class Wallet(val owner: String, val balance: Long)
val a = AtomicReference(Wallet("Kodee", 100_00L))
val updatedWallet = a.updateAndFetch { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(updatedWallet) // Wallet(owner=Kodee, balance=10100)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Платформа и требования к версии: JS (2.2)
actual inline fun AtomicInt.updateAndFetch(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
JS не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.updateAndFetch(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
JS не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.updateAndFetch(transform: (T) -> T): T
Атомарно обновляет значение этого AtomicReference значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
JS не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
data class Wallet(val owner: String, val balance: Long)
val a = AtomicReference(Wallet("Kodee", 100_00L))
val updatedWallet = a.updateAndFetch { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(updatedWallet) // Wallet(owner=Kodee, balance=10100)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Платформа и требования к версии: JVM (2.2)
actual inline fun AtomicInt.updateAndFetch(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого атомарного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.updateAndFetch(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого атомарного длинного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.updateAndFetch(transform: (T) -> T): T
Атомарно обновляет значение этого AtomicReference значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этой атомарной ссылки было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
data class Wallet(val owner: String, val balance: Long)
val a = AtomicReference(Wallet("Kodee", 100_00L))
val updatedWallet = a.updateAndFetch { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(updatedWallet) // Wallet(owner=Kodee, balance=10100)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Платформа и требования к версии: Native (2.2)
inline fun AtomicNativePtr.updateAndFetch(transform: (NativePtr) -> NativePtr): NativePtr
Атомарно обновляет значение этого AtomicNativePtr значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого указателя было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
actual inline fun AtomicInt.updateAndFetch(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого атомарного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.updateAndFetch(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этого атомарного длинного целого числа было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.updateAndFetch(transform: (T) -> T): T
Атомарно обновляет значение этого AtomicReference значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
transform может быть вызвана несколько раз для повторного вычисления результата. Это может произойти, например, если значение этой атомарной ссылки было изменено одновременно с применением transform или из-за ложного сбоя операции compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы выполнение transform было быстрым и не имело побочных эффектов.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
data class Wallet(val owner: String, val balance: Long)
val a = AtomicReference(Wallet("Kodee", 100_00L))
val updatedWallet = a.updateAndFetch { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(updatedWallet) // Wallet(owner=Kodee, balance=10100)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Платформа и требования к версии: Wasm-JS (2.2), Wasm-WASI (2.2)
actual inline fun AtomicInt.updateAndFetch(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
Wasm не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.updateAndFetch(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
Wasm не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val updatedValue = a.updateAndFetch { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(updatedValue) // 22
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.updateAndFetch(transform: (T) -> T): T
Атомарно обновляет значение этого AtomicReference значением, полученным при вызове функции transform для текущего значения, и возвращает новое значение.
Wasm не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
data class Wallet(val owner: String, val balance: Long)
val a = AtomicReference(Wallet("Kodee", 100_00L))
val updatedWallet = a.updateAndFetch { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(updatedWallet) // Wallet(owner=Kodee, balance=10100)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.concurrent.atomics/update-and-fetch.html