吐血整理!这200道阿里P6必备Java面试题,我简直太爱了( 五 )

Java注解面试题注解是什么?

  • Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法 。Annatation(注解)是一个接口 , 程 序可以通过反射来获取指定程序中元素的 Annotation对象 , 然后通过该 Annotation 对象来获取注解中的元数据信息 。
4种标准元注解是哪四种?
  • @Target , 修饰的对象范围@Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、接口、枚举、Annotation 类型)、类型成员 (方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数) 。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标
  • @Retention , 定义被保留的时间长短Retention 定义了该 Annotation 被保留的时间长短:表示需要在什么级别保存注解信息 , 用于描述注解的生命周期(即:被描述的注解在 什么范围内有效) , 取值(RetentionPoicy)由:SOURCE:在源文件中有效(即源文件保留)CLASS:在 class 文件中有效(即 class 保留)RUNTIME:在运行时有效(即运行时保留)
  • @Inherited 阐述了某个被标注的类型是被继承的@Inherited 元注解是一个标记注解 , @Inherited 阐述了某个被标注的类型是被继承的 。如果一 个使用了@Inherited 修饰的 annotation 类型被用于一个 class , 则这个 annotation 将被用于该class 的子类 。
Java多线程、并发面试题Java中实现多线程有几种方法一共有4种方式
  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口 , 通过FutureTask包装器 , 来创建Thread线程
  • 使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService , 管理前面的三种方式)
如何停止一个正在运行的线程
  • 使用退出标志 , 使线程正常退出 , 也就是当run()方法完成后线程终止
  • 使用stop方法强行终止 , 但是不推荐这个方法 , 可能会导致线程操作的数据不一致
  • 使用interrupt方法中断线程 , 并捕获InterruptedException异常
volatile是什么?可以保证有序性吗?
  • 共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后 , 那么就具备了两层语义保证不同线程对这个共享变量进行操作时 , 有可见性 , 就是其中一个线程对该变量值进行修改 , 其他线程是马上可见的 , volatile关键字会强制将修改的值同步到主内存 。禁止指令重排 , 禁止编译器优化代码顺序 , 避免在单例Double Check中导致多次初始化 , 保证有有序性 。
  • 注意 , volatile不能保证原子性 。
Thread 类中的start() 和 run() 方法有什么区别?
  • start()方法被用来启动新创建的线程 , 而且start()内部调用了run()方法 , 这和直接调用run()方法的效果不一样 。当你调用run()方法的时候 , 只会是在原来的线程中调用 , 没有新的线程启动 , start()方法才会启动新线程 。
Java中synchronized 和 ReentrantLock 有什么不同?