[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,没办法),欢迎留言!一起探讨更好的解决方案
推荐阅读
-
对Python新手编程过程中如何规避一些常见问题的建议
-
数据库面试时常见的26个问题
-
Java并发 CompletableFuture异步编程的实现
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java常见面试问题: equals()与hashCode()的使用
-
【并发编程】Java对并发编程的支持历史
-
Java并发编程之常用的辅助类详解
-
Java并发编程中的若干核心技术,向高手进阶!
-
[Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
-
【java基础】面试常见问题:类和对象,封装继承多态,final关键字,static关键字,类加载过程,双亲委派模型