61 lines
2.1 KiB
Markdown
61 lines
2.1 KiB
Markdown
[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) |