golang学习笔记[3] 并发编程
2014-11-30 14:17
218 查看
// one project main.go package main import ( "fmt" "runtime" "sync" ) var counter int = 0 func Count(lock *sync.Mutex) { //每次对counter操作前都需要加锁,每次使用完之后都要解锁。 lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main() { //创建一个sync包下的Mutex结构体 lock := &sync.Mutex{} for i := 0; i < 10; i++ { go Count(lock) } for { lock.Lock() c := counter lock.Unlock() runtime.Gosched() if c > 0 { break } } }
不要通过共享内存来通信,而应该通过通信来共享内存。
使用channel来实现刚刚那个例子
package main import "fmt" func Count(ch chan int) { fmt.Println("Counting") ch <- 1 } func main() { chs := make([]chan int, 10) for i := 0; i < 10; i++ { chs[i] = make(chan int) go Count(chs[i]) } for _, ch := range chs { <-ch } }
// one project main.go package main import ( "fmt" ) func main() { //channel声明 // var chanName chan elementType var ch chan int //一个map键为stringkey为bool类型的channel //var m map[string]chan bool //使用make定义一个channel //ch1 := make(chan int) /* 将一个数据写入(发送)带channel ch <- value 将一个数据从channel中读出 value := <- value */ //select语句 select { //如果chan1成功读到数据,则进行该case处理语句 case <-chan1: //如果成功向chan2写入数据,则进行该case处理语句 case chan2 <- 1: //如果上面都没有成功,则进入default处理流程 default: } ch2 := make(chan int) for { select { case ch <- 0: case ch <- 1: } i := <-ch2 fmt.Println("value", i) } //缓冲机制 //创建一个带缓冲的channel c := make(chan int, 1024) //使用for range读取 for i := range c { fmt.Println(i) } }
相关文章推荐
- JAVA并发编程学习笔记之ReentrantLock
- Java 并发编程学习笔记 理解CLH队列锁算法
- iOS学习笔记09—iOS并发编程
- Java 并发编程学习笔记之Synchronized简介
- 并发编程 学习笔记(一)
- iOS学习笔记09—iOS并发编程
- JAVA并发编程学习笔记之ReentrantLock
- linux网络编程学习笔记之五 -----并发机制与线程�
- 学习笔记:java并发编程学习之初识Concurrent
- JAVA并发编程学习笔记之CAS操作
- JAVA并发设计模式学习笔记(一)—— JAVA多线程编程
- java 并发编程学习笔记之volatile意外问题的正确分析解答
- Java 并发编程实战学习笔记——串行任务转并行任务
- Java 并发编程实战学习笔记
- JAVA并发编程学习笔记之MCS队列锁
- Java并发编程学习笔记 深入理解volatile关键字的作用
- Java 并发编程实战学习笔记——CountDownLatch的使用
- JAVA并发编程学习笔记之synchronized
- 第十二章 并发编程 学习笔记
- java线程学习(二)—并发编程实践学习笔记