golang實現atomic的代碼


原子操作

直接看atomic的AddInt32不太好理解, 增加一個case進行操作就可以熟練了解;

  • TOTAL基數較小的時候,並不存在問題;
  • TOTAL較大的時候就可以看出,多並發的情況下對共享資源的爭搶就會導致增加失敗;
  • LoadInt32 在等待當前有在對該變量執行的go,如果routine一直對某個值在寫,則響應的routine一直在等待呢?
  • atomic.CompareAndSwapInt32, 該值可以在AddInt32的同時進行判斷,是否進行追加交互處理;
atomic.AddInst32(old int32, delta)

示范代碼

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)
const TOTAL = 10000

var wg sync.WaitGroup

func main() {
	fmt.Println("hello atomic")
	var num,num1 int32
	wg.Add(1)

	for i := 0; i < TOTAL; i++ {
		go AddNum(&num)
		go AddNumD(&num1)
	}

    time.Sleep(time.Second * 2)
    
    

	fmt.Println(num, num1)
	wg.Wait()

}

func AddNum(num *int32) {
	atomic.AddInt32(num, 1)
}

func AddNumD(num *int32) {
	*num++
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM