`

go语言goroutine并发安全和锁(五)

    博客分类:
  • Go
 
阅读更多
package main
/*
golang并发安全和锁

互斥锁:并发编程中对共享资源进行访问的控制手段,由标准库中的Mutex结构体类型,
       sync.Mutex类型只有两个公开的指针方法,Lock和Unlock

       可以通过go build -race  main.go 编译后运行, 查看共享资源的竞争

       互斥锁本质是当一个goroutine访问的时候,其他的goroutin都不能访问,
       程序由原来的并行执行变成了串行执行
 读写锁:读写锁可以让多个读操作并发,同时读取,但是对于写操作是完全互斥的。
        当一个goroutine进行写操作的时候,其他的goroutine不能读也不能写
*/


import (
	"fmt"
	"sync"
	"time"
)

var count=0
var wg sync.WaitGroup

var mutex sync.Mutex
/*
对共享资源的访问不加锁的输出结果如下:会出现两个协程同时操作共享资源的情况
count is: 1
count is: 2
count is: 5
count is: 6
count is: 3
count is: 5
count is: 7
count is: 8
count is: 11
count is: 11
count is: 9
count is: 13
count is: 14
count is: 12
count is: 15
count is: 16
count is: 17
count is: 18
count is: 20
count is: 19

加锁后输出的结果如下:
count is: 1
count is: 2
count is: 3
count is: 4
count is: 5
count is: 6
count is: 7
count is: 8
count is: 9
count is: 10
count is: 11
count is: 12
count is: 13
count is: 14
count is: 15
count is: 16
count is: 17
count is: 18
count is: 19
count is: 20
*/

//互斥锁
func test(){
	mutex.Lock()
	count++
	fmt.Println("count is:",count)
	time.Sleep(time.Millisecond)
	mutex.Unlock()

	wg.Done()
}

//读写互斥锁,读的时候并行执行,写的时候串行执行,当一个goroutine执行写的时候不能读和写,执行读的时候,其他goroutine也可以读
var mutex1 sync.RWMutex

func write(){
	mutex1.Lock()
	fmt.Println("---write")
	time.Sleep(time.Millisecond*10)
	mutex1.Unlock()
	wg.Done()
}

func read(){
	mutex1.RLock()
	fmt.Println("read")
	time.Sleep(time.Millisecond*10)
	mutex1.RUnlock()
	wg.Done()
}


func main() {
	for r:=0;r<20;r++{
		wg.Add(1)
		go test()
	}

	for i:=0;i<10;i++{
		wg.Add(1)
		go write()
	}

	for i:=0;i<10;i++{
		wg.Add(1)
		go read()
	}

	wg.Wait()
}

 

分享到:
评论

相关推荐

    【文件夹】Go语言并发之道.pdf

    本书作者带你一步一步深入这些方法。你将理解 Go语言为何选定这些并发模型,这些模型又会...第6章 goroutine和Go语言运行时 223 工作窃取223 窃取任务还是续体 231 向开发人员展示所有这些信息 240 尾声 240 附录A 241

    golang语言爬虫 并发版爬虫源码

    Go语言的核心特性之一就是其强大的并发模型,它采用了CSP(Communicating Sequential Processes)通信顺序进程理论,通过goroutine和channel来实现。goroutine是轻量级线程,启动和销毁的开销极小,而channel则负责...

    Go-Golang编程语言的并发性跟踪和可视化工具

    总的来说,Go语言的并发性跟踪和可视化工具是提升开发效率和代码质量的重要辅助手段。它们不仅帮助我们定位和修复问题,还能让我们更好地设计和优化并发程序,充分利用Go语言的优势。通过像`gotrace`这样的工具,...

    论Go语言中goroutine的使用

    Go语言中的goroutine是一种轻量级的并发机制,但是如果不正确地使用goroutine,可能会导致一些问题。以下是 goroutine 的使用中需要注意的一些问题: 1. Pointer Passing is Not Safe 在Go语言中,goroutine之间的...

    Go语言协程goroutine和管道channel教程.PDF

    其中,协程(goroutine)和管道(channel)是Go语言实现高效并发的核心机制之一。本文将详细介绍goroutine的概念、语法以及在实际开发中的注意事项,并对管道channel进行简要介绍。 #### 二、goroutine详解 ##### ...

    Go语言高并发实战:构建千万级在线的实时消息推送服务

    通过 Channel,我们可以实现 Goroutine 间的同步和数据传递,避免了传统并发编程中的锁和条件变量带来的复杂性。这种模型被称为 CSP(Communicating Sequential Processes),在 Go 中得到了完美的实践。 构建实时...

    Go语言实战.pdf_go语言_Go_go_Go语言实战_

    在并发处理方面,Go语言引入了goroutine和channel的概念。goroutine是一种轻量级的线程,它的创建和销毁成本极低,可以轻松实现大量并发任务。而channel则是一种通信机制,它允许goroutine之间安全地共享数据,避免...

    go语言练手小项目,聊天室,高并发特性(goroutine+管道)

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。在本项目中,我们将探讨如何利用Go语言构建一个聊天室,特别是其内置的高并发特性——goroutine和管道(channel)。...

    基于go语言实现的一个在线聊天demo。主要是为了入门go的goroutine和channel的使用。.zip

    并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...

    go语言电子书.zip

    Go语言支持C风格的语法,同时引入了诸如goroutine(轻量级线程)和channel(通信机制)等特性,使得并发编程变得简单而高效。Go语言的垃圾回收机制则减轻了程序员管理内存的负担,增加了代码的安全性。 在《Go语言...

    go语言高级并发模型

    Go语言是一种支持并发的编程语言,它的并发模型不仅仅是一个库,而是集成在语言和运行时中的特性。Goroutines和Channels是Go并发模型的核心组件,它们允许程序在同一个地址空间中运行多个独立执行的函数,并通过通道...

    Golang协程与Goroutine:并发编程的双生子

    3. **并发支持**:Go语言内置了并发编程的支持,通过Goroutines和Channels,可以轻松地实现并发。 4. **内存管理**:Go语言拥有自动垃圾回收机制,简化了内存管理。 5. **静态类型**:Go是一种静态类型语言,这有助...

    Go语言学习笔记.pdf 共174页

    Go语言学习笔记.pdf 共174页 ...本笔记对Go语言的基础知识、函数、数组、Maps、Structs、接口、并发、程序结构、标准库和扩展库等方面的内容进行了详细的介绍和讲解,是一本非常实用的Go语言学习笔记。

    20120905_go语言和libevent的并发(timer测试)1

    Go语言内置了并发原语,如goroutine和channel,使得并发编程更加简洁和安全;而libevent则是通过事件驱动的方式,将控制权交给事件循环,开发者需要手动管理事件和回调。在性能方面,两者都有其优势,具体取决于应用...

    go语言单并发版爬虫--crawler-v1-v4

    crawler-v1-v4 资源中包含一个完成的go语言并发爬虫案例,其中v1为goroutine+多worker,v2为request+worker双队列,v3将其主模块优化为同时支持v1和v2,v4继续新增多城市访问+排除重复的信息; 该案例非常适合作为go...

    深入理解Go语言的并发编程:Goroutines与Channels.md

    Goroutine是Go语言的轻量级线程,允许并发执行多个任务,而Channel则用于在Goroutines之间安全地传递数据,避免了共享内存带来的复杂性。文章详细介绍了Goroutines的创建、调度及其特点,Channel的基本用法、缓冲及...

    Go-解决Golang并发性练习

    在编程领域,Go 语言(Golang)以其强大的并发特性闻名,这主要归功于它的 Goroutines 和 Channels。本文将深入探讨如何解决 Golang 并发性问题,并通过实际的练习来提升对并发编程的理解。 首先,Goroutines 是 Go...

    浅谈 golang并发 GC

    Golang 的并发控制机制可以确保多个 Goroutine 之间的数据安全和高效执行。 一、Goroutine 介绍 Goroutine 是 Golang 并发设计的核心,它是轻量级的协程,可以通过 go 关键字实现。Golang 在 runtime、系统调度等...

    Go示例学--通过示例学习Golang语言

    在这里,我们也可以看到,Go语言的goroutine和channel机制使得并发编程变得非常简单。我们可以轻松地编写高性能的并发程序,而不需要担心线程同步和死锁的问题。 因此,Go语言是一种非常适合现代网络编程和分布式...

    golang基础教程-go语言快速入门.zip

    Go语言的设计目标是简单、高效、安全,特别适合构建网络服务和并发程序。它吸收了C语言的简洁性,同时加入了现代编程语言的特性,如垃圾回收、内存安全和并发原语。 一、Go语言的特点 1. **简洁性**:Go语言语法...

Global site tag (gtag.js) - Google Analytics