面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数

这篇博客分享了如何在Java面试中解答关于多线程交替执行,一个线程输出偶数,一个线程输出奇数的问题。文章介绍了三种实现方法:synchronized、CAS以及volatile,并解释了为何使用volatile可以优化性能,同时指出使用非原子操作的隐患。最后,博主还提供了一个翻转字符串的面试小彩蛋。

前言

楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多。大部分同学都会使用 synchronized 来实现。楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄!

第一种 synchronized

class ThreadPrintDemo2 {
  public static void main(String[] args) {
    final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2();
    Thread t1 = new Thread(demo2::print1);
    Thread t2 = new Thread(demo2::print2);

    t1.start();
    t2.start();
  }

  public synchronized void print2() {
    for (int i = 1; i <= 100; i += 2) {
      System.out.println(i);
      this.notify();
      try {
        this.wait();
        Thread.sleep(100);// 防止打印速度过快导致混乱
      } catch (InterruptedException e) {
        // NO
      }
    }
  }

  public synchronized void 
### 多线程交替打印奇数偶数的累加值实现代码 为了实现多线程交替打印奇数偶数的累加值,可以使用C++标准库中的`std::mutex``std::condition_variable`来同步线程之间的执行顺序。以下是基于C++的实现代码: ```cpp #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool print_odd = true; // 控制是否打印奇数 int sum = 0; // 累加值 void printOdd() { for (int i = 1; i <= 100; i += 2) { // 打印奇数 std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return print_odd; }); // 等待打印奇数的条件 sum += i; std::cout << "Odd: " << i << ", Sum: " << sum << std::endl; print_odd = false; // 切换到打印偶数 cv.notify_all(); // 通知其他线程 } } void printEven() { for (int i = 2; i <= 100; i += 2) { // 打印偶数 std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return !print_odd; }); // 等待打印偶数的条件 sum += i; std::cout << "Even: " << i << ", Sum: " << sum << std::endl; print_odd = true; // 切换到打印奇数 cv.notify_all(); // 通知其他线程 } } int main() { std::thread t1(printOdd); std::thread t2(printEven); t1.join(); t2.join(); return 0; } ``` 上述代码中,通过`std::condition_variable``std::mutex`实现了线程间的同步[^1]。`print_odd`变量用于控制当前应该打印奇数还是偶数线程在等待自己的条件满足时会阻塞,直到另一个线程完成其任务并通知。 #### 代码解释 - `std::mutex` `std::condition_variable`:用于线程同步。 - `print_odd`:布尔变量,控制当前线程是否打印奇数偶数。 - `cv.wait(lock, predicate)`:让线程在条件不满足时进入等待状态。 - `cv.notify_all()`:唤醒所有等待的线程,以便它们检查条件是否满足。 ### 注意事项 - 确保`print_odd`的初始值正确设置为`true`,以保证程序从打印奇数开始。 - 使用`std::unique_lock<std::mutex>`确保锁的安全释放。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值