- 0
- 0
- 约7.91千字
- 约 24页
- 2026-02-17 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年程序员招聘面试常见问题及答案
一、编程语言基础(共5题,每题10分,总分50分)
1.题目:
请解释Java中的`volatile`关键字的作用,并说明它与`synchronized`的区别。
答案:
`volatile`关键字在Java中用于确保变量的可见性和禁止指令重排序,但不会提供原子性。
-可见性:当一个线程修改了volatile变量的值,其他线程能够立即看到这个修改,因为volatile变量会强制刷新缓存。
-禁止指令重排序:编译器和处理器不会对volatile变量进行重排序,保证代码的执行顺序与程序顺序一致。
`synchronized`关键字则提供原子性和可见性,通过锁机制保证线程安全:
-原子性:保证被synchronized修饰的代码块在同一时间只能被一个线程执行。
-可见性:释放锁时,线程对变量的修改对其他线程可见。
-性能:synchronized是重量级锁,而volatile是轻量级,前者会阻塞线程,后者不会。
解析:
`volatile`适用于读多写少的场景(如状态标记),而`synchronized`适用于写操作频繁的共享资源。两者的核心区别在于锁机制和性能开销。
2.题目:
Python中,如何实现线程安全的计数器?
答案:
在Python中,可以使用`threading.Lock`或`threading.Counter`实现线程安全计数器:
python
importthreading
classThreadSafeCounter:
def__init__(self):
self.value=0
self.lock=threading.Lock()
defincrement(self):
withself.lock:
self.value+=1
returnself.value
counter=ThreadSafeCounter()
threading.Thread(target=counter.increment).start()
或者使用`queue.Counter`(适用于高并发场景):
python
fromqueueimportCounter
counter=Counter()
counter.increment()
解析:
`Lock`保证原子性,`queue.Counter`是线程安全的内置实现,适合高并发场景。
3.题目:
Go语言中,如何优雅地实现一个线程安全的队列?
答案:
Go语言标准库的`sync`包提供`Mutex`或`RWMutex`,可以结合channel实现线程安全队列:
go
packagemain
import(
sync
fmt
)
typeSafeQueuestruct{
queue[]int
musync.Mutex
}
func(qSafeQueue)Push(vint){
q.mu.Lock()
deferq.mu.Unlock()
q.queue=append(q.queue,v)
}
func(qSafeQueue)Pop()(int,bool){
q.mu.Lock()
deferq.mu.Unlock()
iflen(q.queue)==0{
return0,false
}
v:=q.queue[0]
q.queue=q.queue[1:]
returnv,true
}
或使用channel(Go内置的并发模型):
go
queue:=make(chanint,10)//带缓冲的channel
解析:
Go的channel是线程安全的,但需要手动处理关闭和阻塞。Mutex适合需要复杂操作的场景。
4.题目:
C++中,`std::mutex`和`std::atomic`的区别是什么?
答案:
-`std::mutex`:提供互斥锁,保证原子性,适用于复杂共享资源(如读写分离)。
-`std::atomic`:轻量级,用于基本数据类型(如int、bool),禁止编译器重排序,但无法保护复合操作(如`a++`)。
示例:
cpp
includemutex
includeatomic
std::mutexmtx;
std::atomicintcounter(0);
voidincrement(){
std::lock_guardstd::mutexlock(mtx);
counter.fetch_add(1,std::memory_order_relaxed);
}
解析:
`mutex`适用于多线程同步,`atomic`适合无锁
原创力文档

文档评论(0)