21xrx.com
2024-11-05 20:47:33 Tuesday
登录
文章检索 我的文章 写文章
我最近经常看到Java面试题中都会涉及多线程的问题
2023-06-19 09:00:24 深夜i     --     --

我最近经常看到Java面试题中都会涉及多线程的问题,所以我决定系统地整理一下Java线程面试题及答案。在文章中,我将分享一些常见的Java线程问题,以及应对这些问题的策略和代码例子。这些问题分别包括Java线程基础、同步和锁、线程池等。

Java线程基础

1. 什么是线程?

线程是进程中的一条执行路径,负责程序的执行流程。

答案代码示例:


public class MyRunnable implements Runnable {

  public void run()

    // do something

  

}

// 创建线程

Thread thread = new Thread(new MyRunnable());

// 启动线程

thread.start();

2. 线程和进程有什么区别?

线程是进程的一条执行路径,一个进程可以拥有多个线程。线程共享进程的内存空间和系统资源,使用起来更轻量级。

同步和锁

1. 什么是线程安全?

线程安全指的是多个线程对同一个共享资源的访问不会发生问题,保证数据在多线程下的正确性和可靠性。

答案代码示例:


public class Counter {

  private int count;

  public synchronized void increment() {

    count++;

  }

  public int getCount()

    return count;

  

}

// 创建线程并启动

Counter counter = new Counter();

Thread t1 = new Thread(() -> counter.increment());

Thread t2 = new Thread(() -> counter.increment());

t1.start();

t2.start();

t1.join();

t2.join();

System.out.println(counter.getCount()); // 2

2. 如何实现同步?

Java提供了synchronized关键字和Lock接口来实现同步,它们都可以保证互斥访问共享资源。

答案代码示例:


public class Counter {

  private int count;

  private final Object lock = new Object();

  public void increment() {

    synchronized (lock) {

      count++;

    }

  }

  public int getCount()

    return count;

  

}

// 创建线程并启动

Counter counter = new Counter();

Thread t1 = new Thread(() -> counter.increment());

Thread t2 = new Thread(() -> counter.increment());

t1.start();

t2.start();

t1.join();

t2.join();

System.out.println(counter.getCount()); // 2

3. 什么是死锁?

死锁是指两个或多个线程在互相等待对方释放锁而无法执行的状态,造成程序无法继续运行。

答案代码示例:


public class DeadLockExample {

  private static Object resource1 = new Object();

  private static Object resource2 = new Object();

  public static void main(String[] args) {

    Thread t1 = new Thread(() -> {

      synchronized (resource1) {

        System.out.println("Thread1 get resource1");

        try {

          Thread.sleep(1000);

        } catch (InterruptedException e) {

          e.printStackTrace();

        }

        synchronized (resource2) {

          System.out.println("Thread1 get resource2");

        }

      }

    });

    Thread t2 = new Thread(() -> {

      synchronized (resource2) {

        System.out.println("Thread2 get resource2");

        try {

          Thread.sleep(1000);

        } catch (InterruptedException e) {

          e.printStackTrace();

        }

        synchronized (resource1) {

          System.out.println("Thread2 get resource1");

        }

      }

    });

    t1.start();

    t2.start();

  }

}

线程池

1. 什么是线程池?

线程池是预先创建一定数量的线程,放入一个线程队列中,当任务到来时,就从队列中取出一个线程执行任务。线程执行完任务后不会立即销毁,而是放回线程池中等待下一次任务。

答案代码示例:


public class MyTask implements Runnable {

  public void run()

    // do something

  

}

ExecutorService executor = Executors.newFixedThreadPool(5); // 创建线程池

executor.execute(new MyTask()); // 执行任务

executor.shutdown(); // 关闭线程池

2. 如何提高线程池的性能?

可以通过以下方法来提高线程池的性能:

- 合理设置线程池中的线程数

- 重用线程,减少线程的创建和销毁次数

- 适当调整任务队列的长度,控制任务的数量

3. 线程池的几种常见类型及其应用场景?

Java提供了四种类型的线程池:FixedThreadPool、CachedThreadPool、SingleThreadPool和ScheduleThreadPool。每种类型都有自己的适用场景,可以根据任务的特点来选择合适的线程池。

标题:Java线程面试题及答案,掌握这些你就能轻松通过Java多线程面试!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复