大厂面试题:
1、请你谈谈对volatile的理解?
2、CAS你知道吗?
3、原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗?
4、我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?
5、公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。
6、CountDownLatch、CyclicBarrier、Semaphore使用过吗?
7、阻塞队列知道吗?
8、线程池用过吗?ThreadPoolExecutor谈谈你的理解?
9、线程池用过吗?生产上你是如何设置合理参数?
10、死锁编码及定位分析?
Demo One: Callable返回值获取放在最后(futureTask.get())
package com.wwl.juc;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
/**
* 今天就来演示Callable创建线程的方式(Callable带返回值)
*/
class MyThreadByCallable implements Callable
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + "\t 来模拟计算");
// 模拟计算业务
TimeUnit.SECONDS.sleep(3);
return 1024;
}
}
/**
* 三种创建线程方式
* 1、继承Thread类
* 2、实现Runnable接口
* 3、使用Callable
* 今天就来演示Callable创建线程的方式(Callable带返回值)
*/
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask
Thread thread = new Thread(futureTask, "t1");
thread.start();
// Callable返回值获取如果放在这里,它会阻塞main线程计算,会影响并发效率
// Integer t1Result = futureTask.get();
// main线程模拟计算
Integer mainResult = 1000;
System.out.println("main线程计算完毕,mainResult=" + mainResult);
// Callable返回值获取最好放在最后,否则如果t1计算时间过长,它会阻塞main线程计算
Integer t1Result = futureTask.get();
System.out.println("t1线程计算完毕,t1Result=" + t1Result);
System.out.println("两个线程计算总和为:" + (mainResult + t1Result));
}
}
程序执行结果如下:main线程先计算完毕,然后t1线程才计算完毕
Demo Two: Callable返回值获取放在main线程前面(futureTask.get())
package com.wwl.juc;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
/**
* 今天就来演示Callable创建线程的方式(Callable带返回值)
*/
class MyThreadByCallable implements Callable
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + "\t 来模拟计算");
// 模拟计算业务
TimeUnit.SECONDS.sleep(3);
return 1024;
}
}
/**
* 三种创建线程方式
* 1、继承Thread类
* 2、实现Runnable接口
* 3、使用Callable
* 今天就来演示Callable创建线程的方式(Callable带返回值)
*/
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask
Thread thread = new Thread(futureTask, "t1");
thread.start();
// Callable返回值获取如果放在这里,它会阻塞main线程计算,会影响并发效率
Integer t1Result = futureTask.get();
// main线程模拟计算
Integer mainResult = 1000;
System.out.println("main线程计算完毕,mainResult=" + mainResult);
// Callable返回值获取最好放在最后,否则如果t1计算时间过长,它会阻塞main线程计算
//Integer t1Result = futureTask.get();
System.out.println("t1线程计算完毕,t1Result=" + t1Result);
System.out.println("两个线程计算总和为:" + (mainResult + t1Result));
}
}
程序执行结果如下:t1线程计算时间比较长,就阻塞了main线程计算