go 并发编程实践Day2

go 并发编程实践Day2

import (
	"fmt"
	"math"
	"os"
	"sync"
	"text/tabwriter"
	"time"
)

func Day2Main() {
	learnOnceDeadLock()
}

func learnOnceDeadLock(){
	var onceA, onceB sync.Once
	var initB func()
	initA := func() {onceB.Do(initB)}
	initB = func() {onceA.Do(initA)}
	onceA.Do(initA)
}

// 1
func learnOnce() {
	var count int
	increment := func() { count++ }
	decrement := func() { count-- }

	var once sync.Once
	fmt.Println(count)
	once.Do(increment)
	fmt.Println(count)
	once.Do(decrement)
	fmt.Println(count)
}

func learnCondBroadCast() {
	type Button struct {
		Clicked *sync.Cond
	}

	button := Button{Clicked: sync.NewCond(&sync.Mutex{})}
	subscribe := func(cond *sync.Cond, fn func()) {
		var goRunning sync.WaitGroup
		goRunning.Add(1)
		go func() {
			goRunning.Done()
			cond.L.Lock()
			defer cond.L.Unlock()
			cond.Wait()
			fn()
		}()
		goRunning.Wait()
	}

	var clickRegistered sync.WaitGroup
	clickRegistered.Add(3)
	subscribe(button.Clicked, func() {
		defer clickRegistered.Done()
		fmt.Println("Maximizing Window")
	})
	subscribe(button.Clicked, func() {
		defer clickRegistered.Done()
		fmt.Println("Displaying annoying dialog box!")
	})
	subscribe(button.Clicked, func() {
		defer clickRegistered.Done()
		fmt.Println("Mouse Clicked")
	})
	//button.Clicked.Broadcast()
	clickRegistered.Wait()
}

func learnCond() {
	cond := sync.NewCond(&sync.Mutex{})
	queue := make([]interface{}, 0, 10)

	removeQueue := func(delay time.Duration) {
		time.Sleep(delay)
		cond.L.Lock()
		queue = queue[1:]
		fmt.Println("removed from queue")
		cond.L.Unlock()
		cond.Signal()
	}
	for i := 0; i < 10; i++ {
		cond.L.Lock()
		for len(queue) == 2 {
			cond.Wait()
		}
		fmt.Println("Adding to queue")
		queue = append(queue, struct{}{})
		go removeQueue(1 * time.Second)
		cond.L.Unlock()
	}
}

func learnRwMutex() {
	producer := func(wg *sync.WaitGroup, locker sync.Locker) {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			locker.Lock()
			locker.Unlock()
			time.Sleep(1)
		}
	}
	observer := func(wg *sync.WaitGroup, locker sync.Locker) {
		defer wg.Done()
		locker.Lock()
		defer locker.Unlock()
	}

	test := func(count int, mutex, rwMutex sync.Locker) time.Duration {
		var wg sync.WaitGroup
		wg.Add(count + 1)
		beginTestTime := time.Now()
		go producer(&wg, mutex)
		for i := count; i > 0; i-- {
			go observer(&wg, rwMutex)
		}
		wg.Wait()
		return time.Since(beginTestTime)
	}

	writer := tabwriter.NewWriter(os.Stdout, 0, 1, 2, ' ', 0)
	defer writer.Flush()

	var m sync.RWMutex
	fmt.Fprintf(writer, "Readers\tRWMutex\tMutex\n")
	for i := 0; i < 20; i++ {
		count := int(math.Pow(2, float64(i)))
		fmt.Fprintf(writer, "%d\t%v\t%v\n", count, test(count, &m, m.RLocker()), test(count, &m, &m))
	}
}

func learnLocker() {
	var count int
	var lock sync.Mutex

	increment := func() {
		lock.Lock()
		defer lock.Unlock()
		count++
		fmt.Printf("increment count = %d", count)
	}
	decrement := func() {
		lock.Lock()
		defer lock.Unlock()
		count--
		fmt.Printf("decrement count = %d", count)
	}

	var wg sync.WaitGroup
	const num = 5

	for i := 0; i < num; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			go increment()
		}()
	}

	for i := 0; i < num; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			go decrement()
		}()
	}
	wg.Wait()
	fmt.Println("finished")
}

func learnWaitGroup() {
	hello := func(wg *sync.WaitGroup, id int) {
		defer wg.Done()
		fmt.Printf("Hello from %v!\n", id)
	}
	const num = 5
	var wg sync.WaitGroup
	wg.Add(num)
	for i := 0; i < num; i++ {
		go hello(&wg, i+1)
	}
	wg.Wait()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Go并发编程实战第2版PDF》是一本介绍Go语言并发编程实践指南。本书囊括了Go语言中哪些方面的内容呢? 首先,本书从基础开始介绍了并发编程的基本概念和Go语言的并发模型。它详细解释了Goroutine、Channel以及如何使用它们来实现并发编程。读者可以通过本书学习到如何创建和管理Goroutine,如何使用Channel进行消息传递等。 其次,本书还介绍了如何使用Go语言的并发控制机制,如互斥锁、读写锁和条件变量。通过学习这些机制,读者可以了解如何在多个Goroutine之间共享数据并保证数据的安全性和一致性。 此外,本书还探讨了Go语言中的并发模式和并发算法。它介绍了工作池、并发Map、并发队列等常用的并发模式,并通过示例代码演示了如何使用它们解决实际问题。同时,本书还介绍了一些高级的并发算法,如无锁数据结构和原子操作等,帮助读者更深入地理解并发编程的内部机制。 最后,本书还通过实际案例的方式,介绍了如何使用Go语言进行网络编程和并发IO操作。它涵盖了TCP和UDP的网络编程,以及使用Go语言实现并发的文件读写和网络通信等操作。 总而言之,《Go并发编程实战第2版PDF》是一本非常实用的指南,适合有一定Go语言基础的开发者学习和实践。通过阅读本书,读者可以系统地学习和掌握Go语言并发编程的技术,提高程序的并发能力和性能。 ### 回答2: 《Go并发编程实战 第2版pdf》是一本介绍Go语言并发编程的实战指南。它由多位专业的Go语言开发者合作编写而成,非常适合想要学习并发编程的人士阅读和实践。 这本书从基础知识开始,详细介绍了Go语言中并发编程的核心概念和技术。它包含了大量实际的例子和案例,通过这些实例,读者可以学习如何使用Go语言的并发机制来解决现实世界中的问题。 在《Go并发编程实战 第2版pdf》中,作者首先介绍了Go语言的并发原理和基本概念,比如goroutine和channel等。接下来,他们讨论了如何使用这些概念来构建高效的并发程序,并解决相关的问题,如数据竞争和死锁等。 此外,本书还涵盖了一些高级的主题,例如并发编程模式、并发数据结构、并发的网络编程和并发调试等。这些内容有助于读者深入理解并发编程的原理和实践,并在实际项目中应用它们。 总的来说,《Go并发编程实战 第2版pdf》是一本很好的学习资源,它结合了理论和实践,帮助读者掌握Go语言中并发编程的技巧和策略。无论是想要成为一名优秀的Go语言开发者,还是希望提升对并发编程的理解和应用能力,都可以从这本书中收获很多。 ### 回答3: 《Go并发编程实战 第2版 PDF》是一本关于Go语言并发编程的实战指南。该书通过实际的示例和案例,向读者介绍了Go语言的并发编程概念、原理和技术,并提供了丰富的实战经验和最佳实践。 该书的第2版在第1版的基础上进行了更新和扩展,包含了更多的案例和实践经验。书中主要介绍了Go语言中的并发模型、并发安全、并发编程的基本原则等内容。同时,还介绍了Go语言中常用的并发编程工具和库,如goroutine、channel、互斥锁、条件变量等。 读者通过学习《Go并发编程实战 第2版 PDF》,可以了解到如何使用Go语言进行高效的并发编程。书中详细介绍了如何创建、管理和同步goroutine,如何使用channel进行数据传递和同步,并提供了各种实用的并发编程技巧和最佳实践。 此外,书中还介绍了如何进行并发安全的编程,包括如何使用互斥锁和条件变量进行数据的保护和同步。同时,还介绍了如何进行并发测试,包括常用的测试工具和测试技巧。 总之,《Go并发编程实战 第2版 PDF》是一本权威的Go语言并发编程指南,对于想要学习和提升Go语言并发编程技术的读者来说是一本非常有价值的参考书。通过阅读该书,读者可以系统地学习和掌握Go语言的并发编程技术,提高自己的并发编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值