多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)

本文通过一道百度笔试题,探讨了多线程环境下对int型变量x的读写操作的原子性问题。x=1是原子操作,但x++和++x需要同步以防止数据竞争。x=y是否需要同步取决于程序上下文。

    最近天天专注于复习专业课知识,准备迎接十月份的校园招聘。在网上看了几套百度的笔试试题,其中有一道给我留下了深刻的印象。题目如下:

 

以下多线程对int型变量x的操作,哪几个需要进行同步:( )
A. x=y; B. x++; C. ++x; D. x=1;

从表面看上去实在是看不出什么突破口,我们不妨将这些代码译成汇编语言再来分析。

 

01  x = y; 

02  mov eax,dword ptr [y] 

03  mov dword ptr [x],eax 

04   

05  x++; 

06  mov eax,dword ptr [x] 

07  add eax,1 

08  mov dword ptr [x],eax 

09   

10  ++x; 

11  mov eax,dword ptr [x] 

12  add eax,1 

13  mov dword ptr [x],eax 

14   

15  x = 1; 

16  mov dword ptr [x],1 


 

1

### Java高级工程师多线程与高并发笔试题目 以下是针对Java高级工程师职位可能涉及的多线程高并发方面的经典笔试题目: #### 1. **线程安全** 解释为什么`Vector`是线程安全的,而`ArrayList`不是?在实际应用中如何选择这两种集合类型的使用场景? - `Vector`中的方法都带有`synchronized`关键字修饰,因此它是线程安全的;然而这种同步机制会影响性能。相比之下,`ArrayList`并未实现任何同步操作,因此它的性能更高[^5]。 #### 2. **锁机制** 描述Java中的两种主要锁类型及其区别:偏向锁、轻量级锁以及重量级锁。 - 偏向锁假设加锁的操作总是由同一个线程执行,从而减少不必要的同步开销。轻量级锁通过自旋的方式尝试获取锁而不阻塞线程,适用于短时间持有锁的情况。当竞争激烈时,则升级为重量级锁,此时会真正挂起等待的线程[^3]。 #### 3. **volatile关键字的作用** 说明`volatile`关键字的功能及适用场景,并举例说明它无法替代`synchronized`的原因。 - 使用`volatile`可以确保变量的可见性防止指令重排序,但它不提供原子性保障。例如,在多个线程同时对共享变量进行读写操作时,仅靠`volatile`不足以保证一致性,仍需借助`synchronized`或其他同步工具来完成更复杂的逻辑控制[^1]。 #### 4. **线程池的核心参数配置** 列举并解释创建固定大小线程池所需的几个重要参数。 - 创建线程池通常需要指定核心线程数(`corePoolSize`)、最大线程数(`maximumPoolSize`)、队列容量(`workQueue`)闲线程存活时间(`keepAliveTime`)等参数。合理设置这些值能够有效平衡资源利用率与响应速度之间的关系[^2]。 #### 5. **死锁现象分析** 给出一段可能导致死锁的代码片段,并指出其中存在的问题所在。 ```java public class DeadLockExample { private static final Object lockA = new Object(); private static final Object lockB = new Object(); public void methodOne() { synchronized (lockA) { System.out.println("Thread 1 holds Lock A"); try { Thread.sleep(10); } catch (InterruptedException e) {} synchronized (lockB) { System.out.println("Thread 1 trying to hold both locks..."); } } } public void methodTwo() { synchronized (lockB) { System.out.println("Thread 2 holds Lock B"); try { Thread.sleep(10); } catch (InterruptedException e) {} synchronized (lockA) { System.out.println("Thread 2 trying to hold both locks..."); } } } } ``` 上述例子展示了两个线程分别试图按不同顺序锁定相同的对象实例,最终陷入互相等待的状态形成死锁局面[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值