2016 - 2024

感恩一路有你

java多线程并发面试题 多线程编程的时候,使用无锁结构会不会比有锁结构更加快?

浏览量:2307 时间:2021-03-16 19:40:12 作者:admin

多线程编程的时候,使用无锁结构会不会比有锁结构更加快?

这是毫无疑问的,因为线程锁定是资源密集型的

!那么,如何避免锁的性能下降呢?

1、从业务上避免大量锁结构

!2. 使用ThreadLocal,可以保证每个线程中的数据不会互相污染

!3. 如果读多写少,请使用读写锁

!4. 自旋锁将挑战CPU,尽管它是一个线程时间很少的锁

!5. 锁的粒度应该尽可能小:如果锁可以在方法中,就不应该占用整个方法

例如,如何使用compareandswap实现原子操作而不锁定一个简单的int变量?

因为两个线程可能同时获得此变量,如果两个线程几乎同时比较,则可能同时为真。

底层是否有类似锁的实现?

以go中的coroutine为例:

package main

import(

“FMT”

]“sync”

“sync/atomic”

var counter int32=0

func main(){

n:=100

WG:=New(sync.WaitGroup组)

工作组添加(n)

对于i:=0 i<n i{

go inc(i,wg)

}等等()

格式打印(计数器)

}

func inc(i int,wg*sync.WaitGroup组){

推迟工作组完成()

自旋:=0

对于{

旧:=counter

如果原子.CompareAndSwapInt32(&counter,old,old 1){

break

}否则{

spin

}

}

如果spin> 0{格式打印(“I,as:”,I,“,自旋数:”,旋转)

}]}]不要锁定计数器。在Inc方法中,如果两个goroutine在执行old:=counter步骤时获得相同的计数器,那么两个goroutine是否可能获得相同的计数器如果不可能,原理是什么?

在CAS中,如何保证两个线程的compare结果不是同时为true?

这是培训机构告诉你的吗?具体的年薪不仅仅是一个广告的问题,还取决于你完成学业后去哪一个城市,去哪一类公司。一般的培训机构会吹嘘自己有一种特殊的技能,但事实可能并非如此

java多线程并发面试题 java解决高并发的几种方法 多线程aba问题

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。