go实现并发安全hashtable 拉链法

news/2024/11/8 1:17:21/

在这个实现中,HashTable包含多个bucket,每个bucket都有一个互斥锁来保证并发安全。Put方法用于插入键值对,Get方法用于获取值,Delete方法用于删除键值对。通过哈希函数确定键应该存储在哪个bucket中,然后在对应的bucket中进行操作。这种实现方式可以有效地处理并发访问,确保哈希表在多线程环境下的正确性。

package mainimport ("sync"
)type HashTable struct {buckets    []*bucketbucketSize int
}type bucket struct {mu     sync.Mutexitems  map[string]interface{}
}func NewHashTable(bucketSize int) *HashTable {buckets := make([]*bucket, bucketSize)for i := range buckets {buckets[i] = &bucket{items: make(map[string]interface{}),}}return &HashTable{buckets:    buckets,bucketSize: bucketSize,}
}func (ht *HashTable) hash(key string) int {hashValue := 0for _, char := range key {hashValue += int(char)}return hashValue % ht.bucketSize
}func (ht *HashTable) Put(key string, value interface{}) {bucketIndex := ht.hash(key)bucket := ht.buckets[bucketIndex]bucket.mu.Lock()bucket.items[key] = valuebucket.mu.Unlock()
}func (ht *HashTable) Get(key string) (interface{}, bool) {bucketIndex := ht.hash(key)bucket := ht.buckets[bucketIndex]bucket.mu.Lock()value, ok := bucket.items[key]bucket.mu.Unlock()return value, ok
}func (ht *HashTable) Delete(key string) {bucketIndex := ht.hash(key)bucket := ht.buckets[bucketIndex]bucket.mu.Lock()delete(bucket.items, key)bucket.mu.Unlock()
}func main() {ht := NewHashTable(10)// 并发安全地插入数据var wg sync.WaitGroupfor i := 0; i < 100; i++ {wg.Add(1)go func(i int) {defer wg.Done()ht.Put(fmt.Sprintf("key%d", i), i)}(i)}wg.Wait()// 并发安全地读取数据for i := 0; i < 100; i++ {wg.Add(1)go func(i int) {defer wg.Done()value, ok := ht.Get(fmt.Sprintf("key%d", i))if ok {fmt.Println(value)}}(i)}wg.Wait()// 并发安全地删除数据for i := 0; i < 100; i++ {wg.Add(1)go func(i int) {defer wg.Done()ht.Delete(fmt.Sprintf("key%d", i))}(i)}wg.Wait()
}

http://www.ppmy.cn/news/1545217.html

相关文章

微信小程序uniapp+vue飞机订票航空售票系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的&#xff0c;举例像所有的管理员&#xff1b;管理员…

centos查看硬盘资源使用情况命令大全

在 CentOS 系统中&#xff0c;你可以使用几个命令来查看硬盘的资源和使用情况。以下是一些常用的命令&#xff1a; 1. df 命令 df (disk free) 用于显示文件系统的磁盘空间占用情况。 df -h-h 参数表示以人类可读的格式&#xff08;如 GB, MB&#xff09;显示。输出会显示每…

一:时序数据库-Influx应用

目录 0、版本号 1、登录页面 2、账号基本信息 3、数据库案例 4、可视化 5、java案例 0、版本号 InfluxDB v2.4.0 1、登录页面 http://127.0.0.1:8086/signin 账号&#xff1a;自己账号 密码&#xff1a;自己密码 2、账号基本信息 查看用户id和组织id&#xff01;&…

渗透测试-Linux基础(1)

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 这里写目录标题 文件管理创建空文件删除…

(微服务)服务治理:几种开源限流算法库/应用软件介绍和使用

一、Go time/rate 限流器 1.1 简介 Go 在 x 标准库&#xff0c;即 golang.org/x/time/rate 里自带了一个限流器&#xff0c;这个限流器是基于令牌桶算法&#xff08;token bucket&#xff09;实现的。 在上一篇文章讲了几种限流算法&#xff0c;里面就有令牌桶算法&#xff…

unity 镜面 反射

URP 镜面 资源绑定 下载 namespace UnityEngine.Rendering.Universal { [ExecuteInEditMode]public class PlanarURP : MonoBehaviour{public bool VR false;public int ReflectionTexResolution 512;public float Offset 0.0f;[Range(0, 1)]public float Reflecti…

Android——Fragment

Fragment 静态注册 ...<fragmentandroid:id"id/fragment_static"android:name"com.example.study_android.fragment.StaticFragment"android:layout_width"match_parent"android:layout_height"60dp"/><TextViewandroid:layo…

Redisson实现RedLock分布式锁同步

【案例实战】SpringBoot整合Redisson实现RedLock分布式锁同步_redis同步锁-CSDN博客