欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Java] 面试常见的并发编程问题

程序员文章站 2022-06-05 14:14:05
...

交替打印数字

核心:synchronized,Object.wait() / notify()
思路:一个线程打印数字后就阻塞在 lock 上,由另一个线程打印数字后再唤醒

Object lock = new Object();
// 偶数线程
new Thread(() -> {
    for (int i = 0; i < 100; i += 2) {
        synchronized (lock) {
            System.out.println("偶数 " + i);
            try {
                lock.wait();
                lock.notify();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();
// 奇数线程
new Thread(() -> {
    for (int i = 1; i < 100; i += 2) {
        synchronized (lock) {
            System.out.println("奇数 " + i);
            try {
                lock.notify();
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

三个线程轮流打印 ABC

核心:原子类
思路:原子类保证访问字符串下标自增的原子性,CAS 自旋等待

AtomicInteger state = new AtomicInteger(0);
String alpha = "ABC";
// 打印 A 线程
new Thread(() -> {
    for (int i = 0; i < 30; i++) {
        while (state.get() != 0) {}
        System.out.println(alpha.charAt(0));
        state.set(1);
    }
}).start();
// 打印 B 线程
new Thread(() -> {
    for (int i = 0; i < 30; i++) {
        while (state.get() != 1) {}
        System.out.println(alpha.charAt(1));
        state.set(2);
    }
}).start();
// 打印 C 线程
new Thread(() -> {
    for (int i = 0; i < 30; i++) {
        while (state.get() != 2) {}
        System.out.println(alpha.charAt(2));
        state.set(0);
    }
}).start();

生产者消费者

// TODO

实现阻塞队列

// TODO

p.s. 也许并不是全网最少的,但是是我N轮面试总结后,个人觉得最简洁的实现方式了(我比较菜 o(╥﹏╥)o,没办法),欢迎留言!一起探讨更好的解决方案