- 0
- 0
- 约5.79千字
- 约 18页
- 2026-01-29 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年程序员面试题库及答案速查手册
一、编程语言基础(3题,每题10分)
1.题目:
请解释Java中的`volatile`关键字的作用,并说明它与`synchronized`关键字的区别。
答案:
`volatile`关键字在Java中用于确保变量的可见性和有序性,但不保证原子性。
-可见性:当一个线程修改了volatile变量时,其他线程能够立即看到这个修改。
-有序性:volatile变量会禁止指令重排序,保证代码的执行顺序与程序顺序一致。
`synchronized`关键字则提供互斥锁,确保同一时间只有一个线程可以执行某个方法或代码块,同时保证原子性和可见性。
-互斥性:防止多个线程同时访问临界区。
-原子性:保证被锁保护的代码块要么完全执行,要么不执行。
-可见性:线程进入锁状态后,对共享变量的修改对其他线程可见。
区别:
-`volatile`轻量级,只保证可见性和有序性,不保证原子性;`synchronized`重量级,提供互斥、原子性和可见性。
-`volatile`适用于频繁读写的变量,`synchronized`适用于写操作较少的共享资源。
2.题目:
在Python中,如何实现线程安全的队列?请举例说明。
答案:
Python标准库中的`queue.Queue`是线程安全的队列实现,内部使用锁(Lock)保证线程安全。
示例代码:
python
fromqueueimportQueue
importthreading
defproducer(queue):
foriinrange(5):
queue.put(i)
print(fProduced:{i})
time.sleep(1)
defconsumer(queue):
whileTrue:
item=queue.get()
ifitemisNone:
break
print(fConsumed:{item})
time.sleep(1)
queue=Queue()
p=threading.Thread(target=producer,args=(queue,))
c=threading.Thread(target=consumer,args=(queue,))
p.start()
c.start()
p.join()
queue.put(None)#结束消费者
c.join()
`Queue`内部使用锁,确保`put`和`get`操作互斥,避免竞态条件。
3.题目:
C++中,`std::mutex`与`std::atomic`的区别是什么?
答案:
-`std::mutex`:互斥锁,用于保护共享资源,需要手动解锁,可能导致死锁。
cpp
std::mutexmtx;
mtx.lock();
//临界区
mtx.unlock();
-`std::atomic`:原子类型,保证单个操作的原子性,无需锁,性能更高,但只能用于简单类型(如整数)。
cpp
std::atomicintcount(0);
count.fetch_add(1,std::memory_order_relaxed);
区别:
-`mutex`支持复杂操作(如条件变量),`atomic`只支持简单类型。
-`mutex`可能死锁,`atomic`无此风险。
-`atomic`性能更高,适用于无锁编程。
二、数据结构与算法(5题,每题12分)
1.题目:
请实现快速排序算法,并说明其时间复杂度。
答案:
快速排序伪代码:
python
defquicksort(arr):
iflen(arr)=1:
returnarr
pivot=arr[len(arr)//2]
left=[xforxinarrifxpivot]
middle=[xforxinarrifx==pivot]
right=[xforxinarrifxpivot]
returnquicksort(left)+middle+quicksort(right)
时间复杂度:
-最好/平均:O(nlogn),每次分区均匀。
-最坏:O(n2),每次分区极不均匀(如已排序数组)。
优化:
-随机选择枢轴,避免最坏情况。
-使用三数取中法选择枢轴。
2.题目:
如何用链表实现栈?请说明栈的操作原理。
答案:
链表栈:头节点作为栈顶。
-push:在头部插入节点。
-pop:删除头部节点。
-peek:返回头部节点值。
示例代码(Python):
python
classListNo
原创力文档

文档评论(0)