Java每日面试题

时间:2024-04-25 10:43:28

Java 高级面试问题及答案

问题1: 请解释Java中的强引用、软引用、弱引用和虚引用的区别?

答案:
在Java中,引用类型决定了对象的生命周期。强引用是最常见的,只要强引用存在,对象就不会被垃圾回收。软引用通过java.lang.ref.SoftReference实现,它允许垃圾回收器在内存不足时回收这些对象。弱引用通过java.lang.ref.WeakReference实现,比软引用更弱,只要发生垃圾回收,不管内存是否充足,只要对象的弱引用存在,对象就会被回收。虚引用是最弱的引用,通过java.lang.ref.PhantomReference实现,主要用于跟踪对象被垃圾回收的活动。

问题2: 描述Java中的类加载机制,并说明类加载器的双亲委派模型?

答案:
Java的类加载器负责加载.class文件到JVM中。类加载过程包括加载、验证、准备、解析和初始化五个阶段。双亲委派模型是一种工作机制,要求除了顶层的启动类加载器外,其它类加载器在加载类时,都会首先委托给父类加载器去完成,只有当父类加载器无法完成时,才由自己尝试加载。

问题3: 在Java中,如何实现线程安全的单例模式?请列举至少两种方法。

答案:
实现线程安全的单例模式可以通过以下两种方法:

  1. 懒汉式(线程安全): 使用synchronized关键字确保在多线程环境下,只有一个线程可以创建实例。

    public class Singleton {
        private static Singleton instance;
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
  2. 饿汉式: 在类加载时就创建实例,避免了线程安全问题。

    public class Singleton {
        private static final Singleton INSTANCE = new Singleton();
    
        public static Singleton getInstance() {
            return INSTANCE;
        }
    }
    
  3. 静态内部类: 利用类加载的机制来实现线程安全的单例模式。

    public class Singleton {
        private Singleton() {}
        private static class SingletonHolder {
            private static final Singleton INSTANCE = new Singleton();
        }
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    

问题4: 解释Java中锁的种类及其使用场景?

答案:
Java中锁的种类主要包括:

  1. 内置锁(Synchronized): 是一种可重入的互斥锁,用于保护临界区,防止多线程同时访问。

  2. 显式锁(Lock接口): 提供了比synchronized更丰富的锁控制,如公平性、可中断性、超时等。

  3. 偏向锁: 只有在没有竞争的情况下才会使用,它偏向于第一个获取它的线程。

  4. 轻量级锁: 依赖于CAS操作,适用于竞争不激烈,线程数不多的场景。

  5. 读写锁(ReadWriteLock): 允许多个线程同时读,但写入时是排他的。

每种锁的使用场景不同,需要根据具体的并发需求来选择最合适的锁类型。

以上问题及答案的框架提供了基本的面试回答,但为了达到1300字的要求,您可以根据需要进一步扩展每个问题的答案,增加更多的细节和代码示例。请在实际面试准备中根据具体情况进行调整。