golang之包和锁的机制
互斥锁
同一时刻只有一个携程在操作
package main import (
"fmt"
"math/rand"
"sync"
"time"
)
//互斥锁
var lock sync.Mutex func testMap() {
var a map[int]int
a = make(map[int]int, )
a[] =
a[] =
a[] =
a[] =
for i := ; i < ; i++ {
func(b map[int]int) {
lock.Lock()
b[] = rand.Intn()
lock.Unlock()
}(a)
}
lock.Lock()
fmt.Println(a)
lock.Unlock()
time.Sleep(time.Second)
}
func main() {
//互斥锁
testMap()
}
读写锁
读多写少的情况,用读写锁, 携程同时在操作读。
package main import (
"fmt"
"math/rand"
"sync"
"time"
) //读写锁
var rwLock sync.RWMutex func testRWLock() {
var a map[int]int
a = make(map[int]int, )
a[] =
a[] =
a[] =
a[] =
a[] =
for i := ; i < ; i++ {
go func(b map[int]int) {
rwLock.Lock()
b[] = rand.Intn()
rwLock.Unlock()
}(a)
}
for i := ; i < ; i++ {
go func(b map[int]int) {
rwLock.RLock() //读锁
fmt.Println(a)
rwLock.RUnlock()
}(a)
}
time.Sleep(time.Second * ) }
func main() { testRWLock()
//读多写少的时候,用读写锁
}
读写锁,互斥锁,性能比较
package main import (
"fmt"
"math/rand"
"sync"
"sync/atomic"
"time"
) //读写锁
var rwLock sync.RWMutex
var lock sync.Mutex func testRWLock() {
var a map[int]int
a = make(map[int]int, )
var count int32
a[] =
a[] =
a[] =
a[] =
a[] =
for i := ; i < ; i++ {
go func(b map[int]int) {
//rwLock.Lock() //读写锁的代码
lock.Lock() //互斥锁的代码
b[] = rand.Intn()
time.Sleep( * time.Microsecond) //微妙
//rwLock.Unlock()
lock.Unlock() }(a)
}
for i := ; i < ; i++ {
go func(b map[int]int) {
for {
//rwLock.RLock() //读写锁的代码
lock.Lock()
time.Sleep(time.Millisecond)
//rwLock.RUnlock()
lock.Unlock()
atomic.AddInt32(&count, )
}
}(a)
}
time.Sleep(time.Second * )
fmt.Println(atomic.LoadInt32(&count))
}
func main() {
//互斥锁
testRWLock()
//读多写少的时候,用读写锁
}
golang之包和锁的机制的更多相关文章
- Golang Vendor 包机制 及 注意事项
现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...
- golang sync包
sync 在golang 文档上,golang不希望通过共享内存来进行进程间的协同操作,而是通过channel的方式来进行,当然,golang也提供了共享内存,锁等机制进行协同操作的包: 互斥锁: M ...
- Golang fmt包使用小技巧
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...
- 3、JUC--ConcurrentHashMap 锁分段机制
ConcurrentHashMap Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能. ConcurrentHashMap 同步容器 ...
- Golang Vendor 包管理工具 glide 使用教程
Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...
- java多线程 -- ConcurrentHashMap 锁分段 机制
hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...
- Golang测试包
Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...
- Golang Context 包详解
Golang Context 包详解 0. 引言 在 Go 语言编写的服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务.同时,这个 goroutine 也 ...
- 3.ConcurrentHashMap 锁分段机制 Copy-On-Write
/*ConcurrentHashMap*/ Java 5.0 在 java.util.concurrent 包中提供了 多种 并发容器来改进同步容器的性能 ConcurrentHashMap 同步容器 ...
随机推荐
- 命令行视频(ts/m3u8)下载工具 —— youtube-dl(ffmpeg 解码)
youtube-dl 支持的站点:youtube-dl Supported sites youtube-dl 命令行参数: –version:查看版本: 1. 命令行工具安装 安装视频编解码工具 ff ...
- Buildroot make网卡interfaces文件被修改
/******************************************************************************** * Buildroot make网卡 ...
- 7-8 List Leaves(25 分)
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...
- appium使用
学过selenium的朋友再来看appium,基本上就是一个环境折腾问题,还有一个就是初始化Driver的问题,以下代码是初始化Driver WebDriver driver = null; // 驱 ...
- 集合(List、Set、Map)
List,Set是继承自Collection接口,Map不是 public interface List<E> extends Collection<E> { public i ...
- 几个基于jvm 的微服务框架
一个简单的整理,留待深入学习 micronaut http://micronaut.io/ sparkjava http://saprkjava.com spring cloud http://pro ...
- bitmapdata的知识点
flashplayer的cpu渲染 bitmapData占用的内存分两块,一块是原始数据区,另一块是解压后的内存区10秒内如果没有使用这个bitmapdata,解压后的内存区会被释放,当10秒后重新使 ...
- Oracle数据库导入导出(备份还原)
一.数据库的导出 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中(全库导出) exp system/manager@TEST file=d:\ ...
- 错误 1 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttrib
错误 1 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttrib 删除Newtonsoft.Json.dll 引用 ,再重新引用即可. 原 ...
- java 面向对象 — 多态
注意:如果用父类引用指向子类对象的时候.不可以调用,子类中有但是父类中没有的方法. 抽象 方法没有具体方法,以分号结束.例:public abstract void call(); 1.接口必须要有a ...