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 同步容器 ...
随机推荐
- 第1课 学习C++的意义
C++是C语言的加强,它们之间并不是对立的关系. 学习C++的优势: 现代软件产品的架构图: 操作系统抽象层:可有可无,但是作为一个移植性好的软件一定需要这一层.这一层的作用就是把操作系统提供的接口做 ...
- 《DSP using MATLAB》示例Example 10.4
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- c#:Json字符串转成xml对象
没看到.net framework中有这样的功能, 懒得到处找了, 索性花点时间自己写一个 /* * Created by SharpDevelop. * Date: 2013/6/24 * User ...
- 949. Largest Time for Given Digits
Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...
- Linux内核 TCP/IP参数调优
http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml
- Java课程设计---web版斗地主
一. 团队课程设计博客链接 二.个人负责模块和任务说明 负责前后端数据传输 JSP界面的设计 根据后台传来的数据进行页面动态更新 负责Servlet设计 三.自己的代码提交记录截图 四.自己负责模块或 ...
- codeforce1029B B. Creating the Contest(简单dp,简单版单调栈)
B. Creating the Contest time limit per test 1 second memory limit per test 256 megabytes input stand ...
- SpringAOP的两种实现方式
1.SpringAOP,面向切面编程.在实际应用汇总很常见,一般用于日志.异常保存.也可以针对于相应的业务做处理 AOP核心概念 1.横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横 ...
- sqlserver基础操作
启动服务: 1.在系统服务启动 2.在sql配置管理器服务选项中启动 3.在管理员cmd:net start mssqlserver;net stop mssqlserver use master g ...
- 在SUSE Linux Enterprise 11 SP1上用UDEV SCSI配置ASM
1. 编辑/etc/scsi_id.config文件,如果该文件不存在,则创建该文件,添加如下行: options=–whitelisted –replace-whitespace 2. 获取需要绑定 ...