Go 多线程使用Map

最近的项目中用到了GO自带的Map用于存储临时数据,且此Map只增加不删除,主要有两个线程会对其操作。临时数据结构如下

Var Map map[string]UsrStuLock

1:线程一周期性的遍历此Map,并有可能修改其值

2:线程二随机时间被调用,并向Map中增加数据

因为涉及多线程,所以需要配合锁。对线程一和线程二的优先级进行讨论

情况一:如果线程二的优先级没有线程一高,那么处理方式如下:

线程一:

加锁
遍历处理
解锁

线程二:

加锁
添加元素
解锁

那么在Map元素数量较多时,就有可能在遍历过程中,线程二会出现阻塞。所以在线程二优先级较高时需要改进。对于线程一改进如下

线程一(错误的方式)For k,v in Map
  加锁
  获取元素
  解锁 

  对v处理 
  加锁
  Map[k]处理
  解锁
End

这样便可以尽快处理线程二。但这样变没有考虑到线程一对Map的遍历是随机的一旦加入后,无法保证按原先的顺序继续执行。

这里需要对数据结构进行修改。

type  UserMapStu struct {
    KeyMap map[string]int
    DataSlice []didMdcStu
    sync.RWMutex
}
var UMap UserMapStu

线程一遍历时,不在对Map结构遍历,而是遍历DataSlice。

线程二加入数据时,首先判断是否存在,如果不存在,那么加入数据时,先将数据添加到Dataslice,返回下表,作为KeyMap的Value。而Key不变。

时间: 2024-10-12 20:53:08

Go 多线程使用Map的相关文章

Java中ConcurrentHashMap的实现

Java中ConcurrentHashMap的实现 ConcurrentHashMap(简写CHM)引入了分割,并提供了HashTable支持的所有的功能.在CHM中,支持多线程对Map做读操作,并且不需要任何的blocking.这得益于CHM将Map分割成了不同的部分,在执行更新操作时只锁住一部分.根据默认的并发级别(concurrency level),Map被分割成16个部分,并且由不同的锁控制.这意味着,同时最多可以有16个写线程操作Map.试想一下,由只能一个线程进入变成同时可由16个

使用requests爬取猫眼电影TOP100榜单

Requests是一个很方便的python网络编程库,用官方的话是"非转基因,可以安全食用".里面封装了很多的方法,避免了urllib/urllib2的繁琐. 这一节使用requests库对猫眼电影的TOP100榜进行抓取. 1 获得页面. 首先确定要爬取的url为http://maoyan.com/board/4,通过requests模块,打印出页面的信息 def get_a_page(url): try: response = requests.get(url) if respon

java集合类(2)

java集合的主要分为三种类型:JAVA集合位于 java.util包 Set(集) List(列表) Map(映射) arrays函数, equals():比较两个array是否相等. fill():将值填入array中. sort():用来对array进行排序. binarySearch():在排好序的array中寻找元素. arraycopy():array的复制. 集合分类:Collection.List.Set.Map都是接口,不能实例化. Collection:List.Set :C

Hadoop源代码分析

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.html GFS:http://labs.google.com/papers/gfs.html BigTable:http://labs.googl

转发与重定向学习代码

html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>用户登录</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <

深入剖析 Java7 中的 HashMap 和 ConcurrentHashMap

本文将深入剖析 Java7 中的 HashMap 和 ConcurrentHashMap 的源码,解析 HashMap 线程不安全的原理以及解决方案,最后以测试用例加以验证. 1 Java7 HashMap HashMap 的数据结构: 从上图中可以看出,HashMap 底层就是一个数组结构,数组中的每一项又是一个链表. 通过查看 JDK 中的 HashMap 源码,可以看到其构造函数有一行代码: public HashMap(int initialCapacity, float loadFac

python requests 正则爬虫

代码: import requests from multiprocessing import Pool from requests.exceptions import RequestException import re import json def get_one_page(url): try: if url=='': return None response=requests.get(url) if response.status_code==200: return response.t

http服务源码分析

多读go的源码,可以加深对go语言的理解和认知,今天分享一下http相关的源码部分 在不使用第三方库的情况下,我们可以很容易的的用go实现一个http服务, package main import ( "fmt" "net/http" ) func IndexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello world ! ") } func main

Java多线程系列六——Map实现类

参考资料: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/ https://stackoverflow.com/questions/35534906/java-hashmap-getobject-infinite-loop Map的一些实现类有及其特性 类 线程安全 特性 Hashtable 是 Key不能为null H