- 博客(7)
- 收藏
- 关注
原创 待解决疑问
如果调用 Wait 之前不加锁的话,就有可能 Unlock 一个未加锁的 Locker。如果read的穿透次数一直达不到dirty map的长度, 那么一直不会讲dirty的数据更新到read中,(如果不释放锁,其他 Wait 的调用者就没有机会加入到 notify 队列中 了),然后一直等待;cond.Wait 方法的实现是,把当前调用者加入到 notify 队列之中后会释放锁。既然队列中有一个UnLock解锁动作, 那么自己代码中的Unlock动作还有必要写吗?多线程并发读取的k1一直是旧的数据?
2023-11-16 11:48:25
28
1
原创 go并发编程相关
缺点:不适用于大量写的场景,这样会导致 read map 读不到数据而进一步加锁读取,同时dirty map也会一直晋升为read map,整体性能较差,甚至没有单纯的 map+metux 高。sync.Map底层使用了两个原生map,一个叫read,仅用于读;当一个或者多个 reader 持有锁的时候,竞争锁的 writer 会等待这些 reader 释放完,才可能持有这把锁。如果 Cond 等待队列中有一个或者多个等待的 goroutine,则清空所有等待的 goroutine,并全部唤醒。
2023-11-14 15:15:48
35
原创 golang面试题
map默认为非线程安全的, 并发读写会直接报 panic.原因: 多个 goroutine操作同一个 map的场景并不多, 设置为并发安全的会损失性能。
2023-11-01 08:07:57
70
1
原创 Channel相关
数组, 切片, map的并发读写问题go语言中数组和切片支持并发读写,但是如果在不加任何锁的情况下,读写后的结果是无法预期的go语言中map是不支持并发读写的,如果多个协程并发读写同一个map的话,会直接报错go语言原生的map不支持并发读写的, 但是 sync.Map是支持并发读写的上面的代码, 输出结果有多种情况:可能输出不确定个myvalue。
2023-10-21 21:01:51
35
1
原创 Leetcode 160.相交链表
#原题链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
2023-10-21 17:12:26
39
1
原创 Leetcode 152.乘积最大子数组
测试用例的答案是一个 32-位 整数。子数组 是数组的连续子序列。示例 1:输入: nums = [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: nums = [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。*/
2023-10-21 17:02:18
83
1
原创 剑指offer02 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。示例 1:输入:输出:解释:--> 返回 -3.--> 返回 0.--> 返回 -2.
2023-10-19 01:03:32
45
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人