这次给大家分享一位同学面试理想汽车的Java 后端校招一面面经,顺利通过一面了,进入二面。考察的知识点, 针对八股文的涉及的内容,我帮大家列了一下:
-
Java并发:多线程(创建方式、线程状态)、锁(synchronized、reentrantlock)、公平锁和非公平锁
-
mysql:事务隔离级别、mvcc
-
jvm:jvm 内存模型
-
手撕:单例设计模式、算法
总共面试时长 45 分钟,整体难度算中等。
Java 并发
创建线程方式有哪些?
方式一:继承Thread类并重写run()方法。
public class CreatingThread01 extends Thread {
@Override
public void run() {
System.out.println(getName() + " is running");
}
public static void main(String[] args) {
new CreatingThread01().start();
new CreatingThread01().start();
new CreatingThread01().start();
new CreatingThread01().start();
}
}
采用继承Thread类方式
-
优点: 编写简单,如果需要访问当前线程,无需使用Thread.currentThread ()方法,直接使用this,即可获得当前线程
-
缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类
方式二:实现Runnable接口并实现run()方法,然后将实现了Runnable接口的类传递给Thread类。
public class CreatingThread02 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " is running");
}
public static void main(String[] args) {
new Thread(new CreatingThread02()).start();
new Thread(new CreatingThread02()).start();
new Thread(new CreatingThread02()).start();
new Thread(new CreatingThread02()).start();
}
}
采用实现Runnable接口方式:
-
优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
-
缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
方式三:使用Callable和Future接口通过Executor框架创建线程。
public class CreatingThread03 implements Callable<Long> {
@Override
public Long call() throws Exception {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getId() + " is running");
return Thread.currentThread().getId();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Long