大厂面试题:
我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?
公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。
CountDownLatch、CyclicBarrier、Semaphore使用过吗?
阻塞队列知道吗?
线程池用过吗?ThreadPoolExecutor谈谈你的理解?
线程池用过吗?生产上你是如何设置合理参数?
死锁编码及定位分析?
Synchronous阻塞队列是一个不存储元素的队列,即单个元素队列。
package com.wwl.juc;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/**
* SynchronousBlocking是一个不存储元素的阻塞队列,即单个元素队列
*/
public class SynchronousQueueDemo {
public static void main(String[] args) {
BlockingQueue
// 生产者线程进行put操作
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "\t put one");
blockingQueue.put("one");
System.out.println(Thread.currentThread().getName() + "\t put two");
blockingQueue.put("two");
System.out.println(Thread.currentThread().getName() + "\t put three");
blockingQueue.put("three");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t1").start();
// 消费者线程进行take操作
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName() + "\t take one");
blockingQueue.take();
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName() + "\t take two");
blockingQueue.take();
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName() + "\t take three");
blockingQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"t2").start();
}
}
程序执行结果如下:因为消费者线程每隔5秒钟取一个元素,所以生产者线程也是每隔5秒钟往Synchronous阻塞队列中添加一个元素。
第一次打印:
等待第一个5秒打印:
等待第二个5秒打印:
等待第三个5秒打印: