vault backup: 2025-02-10 17:27:57
This commit is contained in:
61
21.01. Programming/Kotlin/AtomicBoolean.md
Normal file
61
21.01. Programming/Kotlin/AtomicBoolean.md
Normal file
@@ -0,0 +1,61 @@
|
||||
[AtomicBoolean | Android Developers](https://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean)
|
||||
|
||||
## 初始化
|
||||
```kotlin
|
||||
val init = AtomicBoolean(false)
|
||||
or
|
||||
val inti = AtomicBoolean() // Default false
|
||||
```
|
||||
|
||||
## read/write
|
||||
用`get()`取值,用`set()`設值
|
||||
例:
|
||||
```kotlin
|
||||
if (init.get()) { ... } // 如果 init 是 true 的話
|
||||
|
||||
init.set(true) // 將 init 設為 true
|
||||
```
|
||||
|
||||
## 其他function
|
||||
### compareAndExchange
|
||||
- [compareAndExchange](https://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean#compareAndExchange(boolean,%20boolean))
|
||||
```java
|
||||
public final boolean compareAndExchange (
|
||||
boolean expectedValue,
|
||||
boolean newValue)
|
||||
```
|
||||
如果目前的值跟`expectedValue`相等,回傳目前值,並將目前值設為`newValue`。
|
||||
如果目前的值跟`expectedValue`不相等,回傳目前值,不做任何設定。
|
||||
|
||||
### compareAndSet
|
||||
- [compareAndSet](https://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean#compareAndSet(boolean,%20boolean))
|
||||
```java
|
||||
public final boolean compareAndSet (
|
||||
boolean expectedValue,
|
||||
boolean newValue)
|
||||
```
|
||||
如果目前的值跟`expectedValue`相等,return `true`,並將目前值設為`newValue`。
|
||||
如果目前的值跟`expectedValue`不相等,return `false`。
|
||||
|
||||
## 用途
|
||||
一般而言,`set` 與 `get` 已經夠用,但如果需要讀值並設定一個新值的話,那就需要 `compareAndSet` 或是 `compareAndExchange`,不然就需要另一個 `mutex` 來達到同樣效果。
|
||||
假設一個情況,假設目前是 `false` 的情況下,我們可以存取某些資源,所以也要把值設為 `true`,用 `mutex` 的作法如下:
|
||||
```kotlin
|
||||
mutex.lock()
|
||||
if (useable.get()) {
|
||||
useable.set(false)
|
||||
// Do something
|
||||
} else {
|
||||
...
|
||||
}
|
||||
mutex.unlock()
|
||||
```
|
||||
改用 `compareAndSet` 就是:
|
||||
```kotlin
|
||||
if (useable.compareAndSet(false, true)) {
|
||||
// Do something
|
||||
}
|
||||
```
|
||||
|
||||
## 資料
|
||||
- [java - compareandexchange() vs compareandset() of Atomic-Integer - Stack Overflow](https://stackoverflow.com/questions/60648557/compareandexchange-vs-compareandset-of-atomic-integer)
|
||||
Reference in New Issue
Block a user