Spec-Zone.ru › Kotlin 2

updateAndFetch

kotlin-stdlib/kotlin.concurrent.atomics/updateAndFetch

Платформа и требования к версии: Common (2.2)

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Spec-Zone.ru

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