fetch And Update
Требования к платформе и версии: Общая (2.2)
expect inline fun AtomicInt.fetchAndUpdate(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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
expect inline fun AtomicLong.fetchAndUpdate(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
expect inline fun <T> AtomicReference<T>.fetchAndUpdate(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 oldWallet = a.fetchAndUpdate { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(oldWallet) // Wallet(owner=Kodee, balance=10000)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Требования к платформе и версии: JS (2.2)
actual inline fun AtomicInt.fetchAndUpdate(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
JS не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.fetchAndUpdate(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
JS не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.fetchAndUpdate(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 oldWallet = a.fetchAndUpdate { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(oldWallet) // Wallet(owner=Kodee, balance=10000)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Требования к платформе и версии: JVM (2.2)
actual inline fun AtomicInt.fetchAndUpdate(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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.fetchAndUpdate(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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.fetchAndUpdate(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 oldWallet = a.fetchAndUpdate { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(oldWallet) // Wallet(owner=Kodee, balance=10000)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Требования к платформе и версии: Native (2.2)
inline fun AtomicNativePtr.fetchAndUpdate(transform: (NativePtr) -> NativePtr): NativePtr
Атомарно обновляет значение этого AtomicNativePtr значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
transform может вызываться несколько раз для повторного вычисления результата. Это может произойти, например, если этот указатель был одновременно обновлён во время применения transform или из-за ложного сбоя compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.
Рекомендуется, чтобы transform выполнялась быстро и не имела побочных эффектов.
actual inline fun AtomicInt.fetchAndUpdate(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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.fetchAndUpdate(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 oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.fetchAndUpdate(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 oldWallet = a.fetchAndUpdate { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(oldWallet) // Wallet(owner=Kodee, balance=10000)
println(a.load()) // Wallet(owner=Kodee, balance=10100)
//sampleEnd
}
Требования к платформе и версии: Wasm-JS (2.2), Wasm-WASI (2.2)
actual inline fun AtomicInt.fetchAndUpdate(transform: (Int) -> Int): Int
Атомарно обновляет значение этого AtomicInt значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
Wasm не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicInt(7)
val oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0 -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun AtomicLong.fetchAndUpdate(transform: (Long) -> Long): Long
Атомарно обновляет значение этого AtomicLong значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.
Wasm не поддерживает многопоточность, поэтому реализация тривиальна, а transform будет вызвана ровно один раз для вычисления результата.
Примеры
import kotlin.concurrent.atomics.*
import kotlin.concurrent.thread
fun main() {
//sampleStart
val a = AtomicLong(7L)
val oldValue = a.fetchAndUpdate { currentValue ->
when (currentValue % 2) {
0L -> currentValue / 2
else -> 3 * currentValue + 1
}
}
println(oldValue) // 7
println(a.load()) // 22
//sampleEnd
}
actual inline fun <T> AtomicReference<T>.fetchAndUpdate(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 oldWallet = a.fetchAndUpdate { wallet ->
wallet.copy(balance = wallet.balance + 1_00) // Kodee got a buck!
}
println(oldWallet) // Wallet(owner=Kodee, balance=10000)
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/fetch-and-update.html