Spec-Zone.ru › Kotlin 2

fetchAndUpdate

kotlin-stdlib/kotlin.concurrent.atomics/fetchAndUpdate

Требования к платформе и версии: Общая (2.2)

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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)

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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)

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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)

@ExperimentalAtomicApi
inline fun AtomicNativePtr.fetchAndUpdate(transform: (NativePtr) -> NativePtr): NativePtr

Атомарно обновляет значение этого AtomicNativePtr значением, полученным при вызове функции transform для текущего значения, и возвращает значение, заменённое обновлённым.

transform может вызываться несколько раз для повторного вычисления результата. Это может произойти, например, если этот указатель был одновременно обновлён во время применения transform или из-за ложного сбоя compare-and-set. Последний случай зависит от реализации, и на него не следует полагаться.

Рекомендуется, чтобы transform выполнялась быстро и не имела побочных эффектов.


@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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)

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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
}

@ExperimentalAtomicApi
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API