python将数据导入数据库 atomic_使用Atomic
Java的java.util.concurrent包除了提供底層鎖、并發集合外,還提供了一組原子操作的封裝類,它們位于java.util.concurrent.atomic包。
我們以AtomicInteger為例,它提供的主要操作有:
增加值并返回新值:int addAndGet(int delta)
加1后返回新值:int incrementAndGet()
獲取當前值:int get()
用CAS方式設置:int compareAndSet(int expect, int update)
Atomic類是通過無鎖(lock-free)的方式實現的線程安全(thread-safe)訪問。它的主要原理是利用了CAS:Compare and Set。
如果我們自己通過CAS編寫incrementAndGet(),它大概長這樣:
public int incrementAndGet(AtomicInteger var) {
int prev, next;
do {
prev = var.get();
next = prev + 1;
} while ( ! var.compareAndSet(prev, next));
return next;
}
CAS是指,在這個操作中,如果AtomicInteger的當前值是prev,那么就更新為next,返回true。如果AtomicInteger的當前值不是prev,就什么也不干,返回false。通過CAS操作并配合do ... while循環,即使其他線程修改了AtomicInteger的值,最終的結果也是正確的。
我們利用AtomicLong可以編寫一個多線程安全的全局唯一ID生成器:
class IdGenerator {
AtomicLong var = new AtomicLong(0);
public long getNextId() {
return var.incrementAndGet();
}
}
通常情況下,我們并不需要直接用do ... while循環調用compareAndSet實現復雜的并發操作,而是用incrementAndGet()這樣的封裝好的方法,因此,使用起來非常簡單。
在高度競爭的情況下,還可以使用Java 8提供的LongAdder和LongAccumulator。
小結
使用java.util.concurrent.atomic提供的原子操作可以簡化多線程編程:
原子操作實現了無鎖的線程安全;
適用于計數器,累加器等。
總結
以上是生活随笔為你收集整理的python将数据导入数据库 atomic_使用Atomic的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频转码流ffmpeg
- 下一篇: FFMPEG开发之——视频转码