精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用 atomic 包減少鎖沖突

開發 前端
Go 提供了 channel 或 mutex 等內存同步機制,有助于解決不同的問題。在共享內存的情況下,mutex 可以保護內存不發生數據競爭(data race)。不過,雖然存在兩個 mutex,但 Go 也通過 atomic 包提供了原子內存基元來提高性能。在深入研究解決方案之前,我們先回過頭來看看數據競爭。

寫在前面

本文基于 Golang 1.14

Go 提供了 channel 或 mutex 等內存同步機制,有助于解決不同的問題。在共享內存的情況下,mutex 可以保護內存不發生數據競爭(data race)。不過,雖然存在兩個 mutex,但 Go 也通過 atomic 包提供了原子內存基元來提高性能。在深入研究解決方案之前,我們先回過頭來看看數據競爭。

數據競爭

當兩個或兩個以上的 goroutine 同時訪問同一塊內存區域,并且其中至少有一個在寫時,就會發生數據競爭。雖然 map 內部有一定的機制來防止數據競爭,但一個簡單的結構體并沒有任何的機制,因此容易發生數據競爭。

為了說明數據競爭,我以一個goroutine 持續更新的配置為例向大家展示一下。 

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "sync" 
  6.  
  7. type Config struct { 
  8.     a []int 
  9.  
  10. func main() { 
  11.     cfg := &Config{} 
  12.  
  13.     // 啟動一個 writer goroutine,不斷寫入數據 
  14.     go func() { 
  15.         i := 0 
  16.  
  17.         for { 
  18.             i++ 
  19.             cfg.a = []int{i, i + 1, i + 2, i + 3, i + 4, i + 5} 
  20.         } 
  21.     }() 
  22.  
  23.     // 啟動多個 reader goroutine,不斷獲取數據 
  24.     var wg sync.WaitGroup 
  25.     for n := 0; n < 4; n++ { 
  26.         wg.Add(1) 
  27.         go func() { 
  28.             for n := 0; n < 100; n++ { 
  29.                 fmt.Printf("%#v\n", cfg) 
  30.             } 
  31.             wg.Done() 
  32.         }() 
  33.     } 
  34.  
  35.     wg.Wait() 

運行這段代碼可以清楚地看到,原本期望是運行上述代碼后,每一行的數字應該是連續的,但是由于數據競爭的存在,導致結果是非確定性的。 

  1. F:\hello>go run main.go 
  2. [...] 
  3. &main.Config{a:[]int{180954, 180962, 180967, 180972, 180977, 180983}} 
  4. &main.Config{a:[]int{181296, 181304, 181311, 181318, 181322, 181323}} 
  5. &main.Config{a:[]int{181607, 181617, 181624, 181631, 181636, 181643}} 

我們可以在運行時加入參數 --race 看一下結果: 

  1. F:\hello>go run --race main.go 
  2. [...] 
  3. &main.Config{a:[]int(nil)} 
  4. ================== 
  5. &main.Config{a:[]int(nil)} 
  6. WARNING: DATA RACE&main.Config{a:[]int(nil)} 
  7.  
  8. Read at 0x00c00000c210 by Goroutine 9: 
  9.   reflect.Value.Int() 
  10.       D:/Go/src/reflect/value.go:988 +0x3584 
  11.   fmt.(*pp).printValue() 
  12.       D:/Go/src/fmt/print.go:749 +0x3590 
  13.   fmt.(*pp).printValue() 
  14.       D:/Go/src/fmt/print.go:860 +0x8f2 
  15.   fmt.(*pp).printValue() 
  16.       D:/Go/src/fmt/print.go:810 +0x289a 
  17.   fmt.(*pp).printValue() 
  18.       D:/Go/src/fmt/print.go:880 +0x261c 
  19.   fmt.(*pp).printArg() 
  20.       D:/Go/src/fmt/print.go:716 +0x26b 
  21.   fmt.(*pp).doPrintf() 
  22.       D:/Go/src/fmt/print.go:1030 +0x326 
  23.   fmt.Fprintf() 
  24.       D:/Go/src/fmt/print.go:204 +0x86 
  25.   fmt.Printf() 
  26.       D:/Go/src/fmt/print.go:213 +0xbc 
  27.   main.main.func2() 
  28.       F:/hello/main.go:31 +0x42 
  29.  
  30. Previous write at 0x00c00000c210 by goroutine 7: 
  31.   main.main.func1() 
  32.       F:/hello/main.go:21 +0x66 
  33.  
  34. goroutine 9 (running) created at
  35.   main.main() 
  36.       F:/hello/main.go:29 +0x124 
  37.  
  38. goroutine 7 (running) created at
  39.   main.main() 
  40.       F:/hello/main.go:16 +0x95 
  41. ================== 

為了避免同時讀寫過程中產生的數據競爭最常采用的方法可能是使用 mutex 或 atomic 包。

Mutex?還是 Atomic?

標準庫在 sync 包提供了兩種互斥鎖 :sync.Mutex 和 sync.RWMutex。后者在你的程序需要處理多個讀操作和極少的寫操作時進行了優化。

針對上面代碼中產生的數據競爭問題,我們看一下,如何解決呢?

使用 sync.Mutex 解決數據競爭 

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "sync" 
  6.  
  7. // Config 定義一個結構體用于模擬存放配置數據 
  8. type Config struct { 
  9.     a []int 
  10.  
  11. func main() { 
  12.     cfg := &Config{} 
  13.     var mux sync.RWMutex 
  14.  
  15.     // 啟動一個 writer goroutine,不斷寫入數據 
  16.     go func() { 
  17.         i := 0 
  18.  
  19.         for { 
  20.             i++ 
  21.             // 進行數據寫入時,先通過鎖進行鎖定 
  22.             mux.Lock() 
  23.             cfg.a = []int{i, i + 1, i + 2, i + 3, i + 4, i + 5} 
  24.             mux.Unlock() 
  25.         } 
  26.     }() 
  27.  
  28.     // 啟動多個 reader goroutine,不斷獲取數據 
  29.     var wg sync.WaitGroup 
  30.     for n := 0; n < 4; n++ { 
  31.         wg.Add(1) 
  32.         go func() { 
  33.             for n := 0; n < 100; n++ { 
  34.                 // 因為這里只是需要讀取數據,所以只需要加一個讀鎖即可 
  35.                 mux.RLock() 
  36.                 fmt.Printf("%#v\n", cfg) 
  37.                 mux.RUnlock() 
  38.             } 
  39.             wg.Done() 
  40.         }() 
  41.     } 
  42.  
  43.     wg.Wait() 

通過上面的代碼,我們做了兩處改動。第一處改動在寫數據前通過 mux.Lock() 加了一把鎖;第二處改動在讀數據前通過 mux.RLock() 加了一把讀鎖。

運行上述代碼看一下結果: 

  1. F:\hello>go run --race main.go 
  2. &main.Config{a:[]int{512, 513, 514, 515, 516, 517}} 
  3. &main.Config{a:[]int{512, 513, 514, 515, 516, 517}} 
  4. &main.Config{a:[]int{513, 514, 515, 516, 517, 518}} 
  5. &main.Config{a:[]int{513, 514, 515, 516, 517, 518}} 
  6. &main.Config{a:[]int{513, 514, 515, 516, 517, 518}} 
  7. &main.Config{a:[]int{513, 514, 515, 516, 517, 518}} 
  8. &main.Config{a:[]int{514, 515, 516, 517, 518, 519}} 
  9. [...] 

這次達到了我們的預期并且也沒有產生數據競爭。

使用 atomic 解決數據競爭 

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "sync" 
  6.     "sync/atomic" 
  7.  
  8. type Config struct { 
  9.     a []int 
  10.  
  11. func main() { 
  12.     var v atomic.Value 
  13.  
  14.     // 寫入數據 
  15.     go func() { 
  16.         var i int 
  17.         for { 
  18.             i++ 
  19.             cfg := Config{ 
  20.                 a: []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}, 
  21.             } 
  22.             v.Store(cfg) 
  23.         } 
  24.     }() 
  25.  
  26.     // 讀取數據 
  27.     var wg sync.WaitGroup 
  28.     for n := 0; n < 4; n++ { 
  29.         wg.Add(1) 
  30.         go func() { 
  31.             for n := 0; n < 100; n++ { 
  32.                 cfg := v.Load() 
  33.                 fmt.Printf("%#v\n", cfg) 
  34.             } 
  35.             wg.Done() 
  36.         }() 
  37.     } 
  38.  
  39.     wg.Wait() 

這里我們使用了 atomic 包,通過運行我們發現,也同樣達到了我們期望的結果: 

  1. [...] 
  2. main.Config{a:[]int{219142, 219143, 219144, 219145, 219146, 219147}} 
  3. main.Config{a:[]int{219491, 219492, 219493, 219494, 219495, 219496}} 
  4. main.Config{a:[]int{219826, 219827, 219828, 219829, 219830, 219831}} 
  5. main.Config{a:[]int{219948, 219949, 219950, 219951, 219952, 219953}} 

從生成的輸出結果而言,看起來使用 atomic 包的解決方案要快得多,因為它可以生成更高的數字序列。為了更加嚴謹的證明這個結果,我們下面將對這兩個程序進行基準測試。

性能分析

一個 benchmark 應該根據被測量的內容來解釋。因此,我們假設之前的程序,有一個不斷存儲新配置的 數據寫入器,同時也有多個不斷讀取配置的 數據讀取器。為了涵蓋更多潛在的場景,我們還將包括一個只有 數據讀取器 的 benchmark,假設 Config 不經常改變。

下面是部分 benchmark 的代碼: 

  1. func BenchmarkMutexMultipleReaders(b *testing.B) { 
  2.     var lastValue uint64 
  3.     var mux sync.RWMutex 
  4.     var wg sync.WaitGroup 
  5.  
  6.     cfg := Config{ 
  7.         a: []int{0, 0, 0, 0, 0, 0}, 
  8.     } 
  9.  
  10.     for n := 0; n < 4; n++ { 
  11.         wg.Add(1) 
  12.  
  13.         go func() { 
  14.             for n := 0; n < b.N; n++ { 
  15.                 mux.RLock() 
  16.                 atomic.SwapUint64(&lastValue, uint64(cfg.a[0])) 
  17.                 mux.RUnlock() 
  18.             } 
  19.             wg.Done() 
  20.         }() 
  21.     } 
  22.  
  23.     wg.Wait() 

執行上面的測試代碼后我們可以得到如下的結果: 

  1. name                              time/op 
  2. AtomicOneWriterMultipleReaders-4  72.2ns ± 2% 
  3. AtomicMultipleReaders-4           65.8ns ± 2% 
  4.  
  5. MutexOneWriterMultipleReaders-4    717ns ± 3% 
  6. MutexMultipleReaders-4             176ns ± 2% 

基準測試證實了我們之前看到的性能情況。為了了解 mutex 的瓶頸到底在哪里,我們可以在啟用 tracer 的情況下重新運行程序。

goroutines 運行時不間斷,能夠完成任務。對于帶有 mutex 的程序的配置文件,得到的結果那是完全不同的。

現在運行時間相當零碎,這是由于停放 goroutine 的 mutex 造成的。這一點可以從 goroutine 的概覽中得到證實,其中顯示了同步時被阻塞的時間。

屏蔽時間大概占到三分之一的時間,這一點可以從下面的 block profile 的圖中詳細看到。 

在這種情況下,atomic 包肯定會帶來優勢。但是,在某些方面可能會降低性能。例如,如果你要存儲一張大地圖,每次更新地圖時都要復制它,這樣效率就很低。

via: https://medium.com/a-journey-with-go/go-how-to-reduce-lock-contention-with-the-atomic-package-ba3b2664b549

作者:Vincent Blanchon 譯者:double12gzh 校對:lxbwolf

責任編輯:未麗燕 來源: Go語言中文網
相關推薦

2023-12-20 09:50:53

數據庫架構

2023-12-01 08:54:50

Java原子類型

2015-03-27 18:01:58

云計算SaaS應用渠道沖突

2023-07-05 08:18:54

Atomic類樂觀鎖悲觀鎖

2017-03-07 09:17:51

AtomicDocker遠程

2017-11-16 16:15:28

Await開發嵌套

2016-10-17 13:33:26

原子主機AnsibleCockpit

2018-09-12 15:38:42

Javaatomic編程

2015-10-23 17:29:24

AtomicOpenStack 應用部署

2025-05-13 08:00:00

2025-04-03 08:10:00

網絡IP沖突抓包

2011-04-11 11:32:29

Oracle分區表磁盤IO沖突

2011-03-07 09:05:49

鎖競爭MySQL等待時間

2011-03-15 15:47:04

MySQL鎖競爭

2022-06-23 09:00:00

JavaScriptHTML應用程序

2022-03-14 18:18:11

橫向攻擊網絡攻擊

2018-05-07 13:42:52

LinuxnpmNodeJS

2021-09-03 08:21:20

前端代碼模塊

2024-10-07 10:07:31

2024-01-02 13:15:00

分布式鎖RedissonRedis
點贊
收藏

51CTO技術棧公眾號

日韩一级裸体免费视频| 宅男在线国产精品| 日韩在线电影一区| 国产伦理吴梦梦伦理| 亚洲91中文字幕无线码三区| 精品少妇一区二区三区在线播放 | 亚洲国产成人久久综合一区| 妞干网在线播放| 你懂的视频在线| 国产麻豆91精品| 日韩美女写真福利在线观看| 在线免费观看亚洲视频| 欧美色图婷婷| 日韩一区二区视频在线观看| 久久无码高潮喷水| 羞羞网站在线免费观看| 国产亚洲美州欧州综合国| 91一区二区三区| 国产精品国产精品国产| 亚洲国产精品第一区二区| 日韩综合视频在线观看| jizz欧美性20| 777久久精品| 在线观看91av| 色综合手机在线| 欧美男人天堂| 亚洲自拍另类综合| 五月天男人天堂| 成人动漫在线免费观看| 91网站黄www| 痴汉一区二区三区| 国产三区在线播放| 日本91福利区| 国产不卡精品视男人的天堂| 国产精品999久久久| 91精品国产自产在线观看永久∴| 欧美日韩精品三区| 国产91对白刺激露脸在线观看| 婷婷伊人综合中文字幕| 国产盗摄精品一区二区三区在线| 欧美高清不卡在线| 日本中文在线视频| 日韩欧美一区二区三区在线视频| 777a∨成人精品桃花网| 日日干夜夜操s8| 欧美三区四区| 在线观看日韩电影| 国产淫片av片久久久久久| 精精国产xxxx视频在线播放| 亚洲一线二线三线视频| 毛片av在线播放| 麻豆av在线免费观看| 亚洲激情av在线| 女人被男人躁得好爽免费视频 | 国产95亚洲| 欧美福利电影网| 欧美午夜精品理论片| 婷婷丁香久久| 日韩欧美激情在线| 亚洲制服中文字幕| 日本一区二区乱| 日韩免费视频一区二区| 男人添女人荫蒂国产| 亚洲乱码一区| 亚洲大胆美女视频| 免费在线观看你懂的| 免费观看久久av| 国产一区二区三区在线看 | 99re66热这里只有精品3直播 | 成人看片黄a免费看视频| 欧美人狂配大交3d怪物一区| 在线视频观看一区二区| 久久丁香四色| 日韩av影视在线| 国产精品国产三级国产专业不| 亚洲精品一区二区三区中文字幕| 富二代精品短视频| 亚洲色精品三区二区一区| 亚洲不卡系列| 日韩一区二区免费在线观看| 高清中文字幕mv的电影| 天堂成人娱乐在线视频免费播放网站 | 欧美在线观看视频免费| 国产免费拔擦拔擦8x在线播放 | 一级黄色免费网站| 日韩在线观看一区二区| 成人免费xxxxx在线观看| www.黄色小说.com| 国产亚洲成av人在线观看导航 | 久久久精品三级| 伊人久久大香线蕉综合影院首页| 色综合久久88色综合天天6| 91最新在线观看| 日本在线一区二区三区| 亚洲精品久久在线| 亚洲色图27p| 一区二区三区国产在线| 国产乱肥老妇国产一区二| 国产自产一区二区| 中文一区在线播放| 日产精品久久久久久久蜜臀| 美女100%一区| 精品国产乱码久久久久久1区2区| 苍井空张开腿实干12次| 国产一区国产二区国产三区| 久久99热精品这里久久精品| 久久青青草原亚洲av无码麻豆| 亚洲深夜影院| 成人久久一区二区| 欧美精品a∨在线观看不卡 | av影视在线看| 欧美视频在线播放| jjzzjjzz欧美69巨大| 成人3d动漫在线观看| 午夜欧美不卡精品aaaaa| 一区二区视频在线免费观看| 91亚洲精品久久久蜜桃| 成年人深夜视频| 国产乱子精品一区二区在线观看| 欧美日本韩国一区| 国产免费无遮挡吸奶头视频| 国产真实久久| 成人在线中文字幕| 欧美成人免费| 亚洲成av人片www| 亚洲成人av免费观看| 欧美肥老太太性生活| 欧洲精品毛片网站| 人人妻人人澡人人爽人人欧美一区| 成人美女视频在线看| 丰满女人性猛交| 国产91精品在线| 夜夜嗨av色综合久久久综合网| 黄色av免费播放| 亚洲一区黄色| 九9re精品视频在线观看re6| 黑人极品ⅴideos精品欧美棵| 亚洲一区二区不卡免费| 一级黄色大片儿| 911久久香蕉国产线看观看| 国产精自产拍久久久久久蜜| www.亚洲资源| 欧美中文字幕一二三区视频| 美女爆乳18禁www久久久久久 | 黄色一级片播放| 日本高清久久| 色综合男人天堂| 精品国产黄色片| 亚洲自拍与偷拍| 深夜视频在线观看| 亚洲国产免费| 久久久久资源| 日产精品一区| 日韩在线视频二区| 国产特黄一级片| 亚洲一二三四在线| 星空大象在线观看免费播放| 日韩一级网站| 色综合666| 欧美激情不卡| 欧美人与性动交| 色丁香婷婷综合久久| 福利视频一区二区| 国产精品天天干| 久久精品99国产国产精| 在线观看成人免费| 91精品国产自产精品男人的天堂| 色偷偷av一区二区三区乱| 在线观看中文字幕2021| 国产精品久久久久久久久搜平片| 99热久久这里只有精品| 影音成人av| 久色乳综合思思在线视频| 国产免费黄色录像| 亚洲v精品v日韩v欧美v专区| 在线 丝袜 欧美 日韩 制服| 欧美aa在线视频| 四虎4hu永久免费入口| 韩国精品福利一区二区三区| 日本久久久久久久久| av片在线免费观看| 日韩精品影音先锋| 久久久久久不卡| 中文字幕一区av| 中文字幕天堂av| 日韩国产一区二| 久久久无码中文字幕久...| 日韩激情啪啪| 91久久精品在线| 僵尸再翻生在线观看| 中文字幕亚洲字幕| 男人天堂综合网| 欧美日韩一区中文字幕| 久久9999久久免费精品国产| 国产欧美视频一区二区三区| 中文字幕一区二区三区四| 免费一区视频| 米仓穗香在线观看| 国产日产精品_国产精品毛片| 91av视频导航| 国产福利视频在线观看| 亚洲剧情一区二区| 亚洲经典一区二区| 欧美日韩午夜影院| 日韩xxxxxxxxx| 亚洲男人的天堂在线观看| av无码av天天av天天爽| 国产综合色在线| 妺妺窝人体色www在线观看| 精品9999| 中国 免费 av| 成人三级视频| 国产专区一区二区| 爱情电影网av一区二区| 国产成人精品av在线| 成人性生交大片免费看网站| 久久精品电影网站| 国产中文在线| 亚洲精品在线看| 蜜桃av中文字幕| 日韩一区二区三区免费观看| 亚洲一二区视频| 91福利资源站| 国产又粗又爽视频| 午夜电影网亚洲视频| 动漫性做爰视频| 中文字幕一区三区| 国产一区二区三区四区在线| 91婷婷韩国欧美一区二区| 久久久久久久久久影视| 国产高清久久久| 爱豆国产剧免费观看大全剧苏畅| 欧美三级网页| 久久久久久久久网| 亚洲人体av| 影音欧美亚洲| 91麻豆精品国产91久久久平台| 成人欧美一区二区三区黑人孕妇 | 自拍偷拍欧美激情| 精品无码国产污污污免费网站| 日韩高清不卡在线| 国产免费人做人爱午夜视频| 一本色道久久综合亚洲精品不| 欧美大陆一区二区| 国产精品对白| 国产一区二区三区av在线| 国产亚洲精品美女久久| 国产欧美一区二区三区不卡高清| 欧美影视资讯| 日韩免费av一区二区| 欧洲亚洲两性| 国产精品a久久久久久| 欧美国产日韩电影| 国产日韩中文在线| 国产精品视频一区二区三区综合| 69视频在线播放| 在线黄色的网站| 国产盗摄xxxx视频xxx69| 精品国模一区二区三区| 国产精品亚洲一区二区三区| 欧美性aaa| 91传媒在线免费观看| 成人影院中文字幕| 蜜桃久久精品乱码一区二区 | 国产蜜臀在线| 亚洲 日韩 国产第一| 亚洲精品国产精品国产| 国产精品91一区| 国产精品亚洲综合在线观看| 北条麻妃高清一区| 久久影院资源站| 欧美一区观看| 99精品网站| 国产二区视频在线| 久久一区视频| 黄色片免费网址| va亚洲va日韩不卡在线观看| 亚洲av无码国产精品麻豆天美| 大桥未久av一区二区三区中文| jizz18女人| 高潮精品一区videoshd| aa片在线观看视频在线播放| 国产日韩影视精品| 麻豆天美蜜桃91| 精品久久久久久亚洲国产300| 久久免费在线观看视频| 色综合久久精品| 精品久久久久久亚洲综合网站| 欧洲国内综合视频| 精品久久人妻av中文字幕| 日韩精品免费观看| 黄网页免费在线观看| 性欧美xxxx交| 亚洲香蕉久久| 欧美三日本三级少妇三99| 欧美一区视频| 成人免费毛片播放| 国产精品 日产精品 欧美精品| 午夜剧场高清版免费观看| 99精品视频中文字幕| 欧美一级特黄高清视频| 天天综合日日夜夜精品| 888奇米影视| 亚洲欧美日韩区| 暧暧视频在线免费观看| 国产精品日韩精品| 欧美在线导航| 黑人巨茎大战欧美白妇| 日日骚欧美日韩| 在线黄色免费网站| 亚洲欧美乱综合| 中文无码精品一区二区三区| 亚洲国产日韩欧美在线99| 黄色成人影院| 国产精品网站视频| 久久成人av| 波多野结衣家庭教师在线播放| 欧美中文日韩| 无码国产69精品久久久久网站| 99久久久精品| 久久免费视频精品| 91麻豆精品国产91久久久 | 亚洲精品美女在线观看| 中文在线手机av| 成人精品一区二区三区| 欧洲激情综合| 免费看黄色一级大片| 99re热视频精品| 五月天婷婷综合网| 精品1区2区在线观看| 精品176二区| 91精品在线看| 日韩欧美精品一区| 91网址在线播放| 欧美激情一区二区三区四区 | 久久精品青草| 亚洲视频在线观看一区二区三区| 国产综合色在线| 免费在线观看黄色小视频| 欧美性xxxxxx少妇| av大片在线看| 国产日本欧美视频| 91日韩欧美| 国产农村妇女精品久久| 自拍偷拍亚洲综合| 精品久久久久中文慕人妻| 欧美另类极品videosbest最新版本| www.综合| 久久综合久久综合这里只有精品| 日韩欧美一区二区三区免费看| 乱熟女高潮一区二区在线| 国产精品资源在线观看| 可以直接看的黄色网址| 日韩一区二区精品在线观看| 日本色护士高潮视频在线观看 | 91天堂素人约啪| 日本亚洲色大成网站www久久| 欧美精三区欧美精三区| 国产网友自拍视频导航网站在线观看| 欧美黄色www| 欧美三级电影在线| 精品久久久久久久无码| 国产精品久久久久国产精品日日| 国产精品6666| 日韩精品免费综合视频在线播放| 精品176二区| 国产伦精品一区二区三区在线| 精品视频黄色| 日韩av三级在线| 欧美激情一区在线观看| 国产99久一区二区三区a片| 97视频国产在线| 激情五月色综合国产精品| 中文字幕免费高清在线| 亚洲一区二区免费视频| 日本国产在线| 国产欧美韩国高清| 国产真实久久| 中文字幕成人动漫| 日韩一区二区三| a一区二区三区| 精品嫩模一区二区三区| 久久久综合网站| 国产精品视频在线观看免费| 性欧美暴力猛交69hd| 成人毛片免费看| 亚洲男人在线天堂| 欧美日韩精品三区| 华人av在线| 欧美少妇在线观看| 久久久精品国产99久久精品芒果 | 国产精品久久国产精品| 久久夜色精品| 国产精品99精品无码视| 日韩视频第一页| 亚洲成人一品| 在线视频日韩欧美| 欧美性猛交xxxx黑人交| 欧美性video| 中文字幕一区二区三区最新|