首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

n++也不靠谱

今天小明又去面试了,又被问了一个奇怪的面试题: n := 0 for i := 0; i < 1000000; i++ { go func() { n++ }() } fmt.Println(...第二个坑就是面试的重点了: 在不考虑主线程提前退出的问题,就是加入协程后,n++ 的结果不准确了。 为什么呢?...因为 n++ 并不是原子的,他要完成 n++ 的操作他需要做三步: 从内存里面取出值 执行 +1 操作 赋值回去 因为他不是原子的,所以很可能在你取值的时候别的线层也在取值,也在进行计算,最后赋值时就会被覆盖...i := 0; i < 1000000; i++ { wg.Add(1) go func() { defer wg.Done() n++ //不是原子的 1、从内存读出 2、n++ 3、赋值...+ //不是原子的 1、从内存读出 2、n++ 3、赋值 }() } wg.Wait() fmt.Println(n) 这样执行的结果,每次都是执行的次数了。

23420
您找到你想要的搜索结果了吗?
是的
没有找到

线程安全问题(面试常考)

观察多线程下n++和n--操作 我们目前所知当一个变量n==0,n++了1000次并且 n--了1000次,我们的预期结果为0,但是当两个线程分别执行++和--操作时最后的结果是否为0呢?...public void run() { for(int i = 0;i < 1000;i++){ n+...线程安全概念的引入 我们所知单线程下n++和n--同时执行1000次时结果为0,多线程下大部分不为0,所以我们简单定义为在多线程下和单线程下执行相同的操作结果相同时为线程安全 对于多个线程,操作同一个共享数据...+,n--操作: 经过一次n++,n--操作后发现结果不为-1,原因是因为一次++或者--操作是分三步执行: 从内存把数据读到CPU 对数据进行更新操作 再把更新后的操作写入内存 2....次数减1,直到次数减为0才是真的释放锁 可重入锁的意义就是降低程序员负担(使用成本来提高开发效率),代价就是程序的开销增大(维护锁属于哪个线程,并且加减计数,降低了运行效率) 如下情形: 1.3 对n+

11810
领券