Java Threads

1. 创建线程的三种方法?

每个线程都有优先级(Thread.MAX_PRIORITY = 10, Thread.NORM_PRIORITY = 5, Thread.MIN_PRIORITY = 1),新产生线程的优先级默认等于产生它的优先级。

JVM启动后,将会产生一个非守护线程(non-daemon thread,通常被称为main),JVM会一直运行直到:a) Runtime类的exit()方法被调用;b) 所有的非守护线程死亡(run执行完毕或发生异常)。

2. 从高层次上解释可用的线程状态?

  • NEW: 线程准备好执行了,但是还不一定会马上开始执行;
  • RUNNABLE:Java虚拟机正在执行这个线程的代码;
  • BLOCKED: 线程在等待监视器锁时,处于阻塞状态;
  • WAITING: 线程在等待另一个线程执行特定的一些操作;
  • TIMED_WAITING: 线程在等待另一个线程执行一些特定的操作,并且最多等待指定的时间;
  • TERMINATED: 线程已经完成了执行。

3. 线程同步在监视器(monitor)里是怎么工作的?

  • JVM使用锁(locks)和监视器(monitors);
  • 每一个监视器都和一个对象引用关联,线程只有在获得锁之后才能执行代码,
  • 监视器保证在一个时刻仅有一个线程可以执行一段同步代码。

4. synchronized方法和synchronized块有什么区别?

  • 在Java编程中,每一个对象都有一个锁;
  • 一个线程可以通过使用synchronized关键字获得一个对象的锁;
  • Synchronized关键字可以被用在方法级别上(粗粒度锁)或者块级别上(细粒度锁)。

5. 怎样保证N个线程访问N个资源,而不产生死锁?

  • 死锁是两个线程都在等待对方完成后才继续执行,两个线程都会永久等待下去;
  • 当使用N个线程时, 一个很简单的避免死锁的方法是,强制对锁排序,所有线程都按照同样的顺序加锁和解锁,就不会产生死锁。

Java Collections

6. IteratorListIterator的区别?

  • Iterator可以用来遍历Set和List集合,而ListIterator只能用来迭代List;
  • Iterator只可以正向遍历一个集合,而ListIterator 可以双向遍历List;
  • ListIterator实现了Iterator 接口,并且包含其他的功能,比如增加新的元素add(E e),替换一个元素set(E e),获得前面和后面元素的索引位置previousIndex()和nextIndex()。

7. 快速失败(fail-fast)和安全失败(fail-safe)有什么区别?

  • Java.util包中的所有集合类都是快速失败的,而java.util.concurrent包中的集合类都是安全失败的;
  • 快速失败的迭代器抛出ConcurrentModificationException,而安全失败的迭代器从不抛出这个异常。

快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。某个线程在对collection进行迭代时,不允许其他线程对该collection进行结构上的修改。

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast。

迭代器的快速失败行为无法得到保证,它不能保证一定会出现该错误,因此,ConcurrentModificationException应该仅用于检测 bug。

8. HashMapHashtable的区别与选择?

  • HashMap允许null键和值的存在,而Hashtable既不允许null键,也不允许null值;
  • Hashtable是同步的,而HashMap不是。所以,HashMap更被常用在单线程环境中,而Hashtable更适合多线程环境;
  • HashTable提供了键和值对应的CollectionEnumeration,而HashMap只提供了键和值对应的Collection(键是Set);
  • HashMap的子类LinkedHashMap可以记录插入的顺序(用双向链表),当需要按插入顺序遍历时,选用LinkedHashMap会方便很多;
  • HashTable是遗留下来的类。

9. EnumerationIterator的区别?

  • Enumeration是Iterator的两倍快,而且使用较少的内存;
  • Iterator比Enumeration安全,因为一个线程在用迭代器进行遍历时,其他线程不能修改该集合对象;
  • Iterator能够从集合中移除元素remove(),Enumeration不能;
  • Enumeration一般由Vector和HashTable产生,Java API建议使用Iterator。

10. Comparable 和 Comparator的区别?

  • 所在包不同:java.lang.Comparable和java.util.Comparator;
  • 实现Comparable接口的类用compareTo(T o)作为其自然顺序(natural ordering),个人理解,Comparable用于使某类对象具有比较属性,而Comparator则用于生成某类对象的一个单独的比较器;
  • Comparable接口只包含一个方法compareTo(T o),Comparator接口包含compare(T o1, T o2)和equals(Object obj),而且Java8中又添加了许多新方法,比如返回相反的比较器reversed()

二者的比较方法都通过返回负数、0、整数表示小于、等于、大于, 注意,compareTo(T o) == 0或compare(e1, e2) == 0与e1.equals(e2) 应具有相同的真值。Java核心库中只有一个类BigDecimal的compareTo(T o) == 0与e1.equals(e2)返回值不一致,当两个数值相等但精度不同时,如4.0和4.00;

e.equals(null)可以返回false,但e.compareTo(null)应当抛出NullPointerException异常,因为null不是任何类的实例。

11. 使用Java集合框架(Java Collection framework)时有哪些好的做法?

  • 根据应用的需求,选择合适的集合类型,对性能很重要,如元素固定且有序时,应当使用Array而非ArrayList;
  • 能够估计元素个数时,要指定集合的初始容量,避免重复哈希和改变尺寸(rehashing or resizing);
  • 总是使用泛型保证类型安全、可靠性与健壮性,避免ClassCastException
  • 使用JDK提供的不可变类(immutable classes)来作为Map中的键,避免在自定义类中实现hashCode和equals方法;
  • 面向接口编程,而非面向实现;
  • 在集合中为空时,返回0个元素的集合或数组,而不是返回null值。

Exception Handling

12. 被检查的异常(checked exceptions)和不受检查的异常(unchecked exceptions)的区别?

  • 被检查的异常必须在方法或构造器的throws子句中声明,而不受检查的异常不用。

不受检查的异常其实就是RuntimeException,从RuntimeException继承的类都会自动被Java虚拟机抛出,所以不必在异常说明中把它们列出来。其他类型的异常,包括用户自己定义的异常,都必须用throws说明,否则编译将会出错。

13. Exception和Error有什么区别?

  • ExceptionError都是Throwable的子类。Exception定义的异常用户程序必须捕获,Error定义的异常不用捕获。

Java基础知识拾遗(一)的更多相关文章

  1. Java基础知识拾遗(一)

    类型提升规则 Java定义了几个应用于表达式的类型提升规则:所有byte.short和char类型的值都被提升为int类型.如果有一个操作数是long类型,将这个表达式提升为 long 类型:如果有一 ...

  2. Java基础知识拾遗(四)

    IO SequenceInputStream,允许链接多个InputStream对象.在操作上该类从第一个InputStream对象进行读取,知道读取完全部内容,然后切换到第二个InputStream ...

  3. Java基础知识拾遗(三)

    集合框架 SortedSet接口,声明了以升序进行排序的行为. Queue接口,声明了队列行为,队列通常是先进先出的列表 Deque接口,扩展了Queue接口,声明了双端队列的行为.双端队列可以像标准 ...

  4. java基础知识拾遗(四)

    1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...

  5. java基础知识拾遗(三)

    1.类加载 bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. extension classloader -扩展类加载器,它负责加载JRE的扩展目 ...

  6. java基础知识拾遗(二)

    1.finally public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally { retur ...

  7. Java基础知识拾遗(二)

    Lambda表达式 lambda表达式本质上就是一个匿名方法.但是这个方法不是独立执行的,而是构成了一个函数式接口定义的抽象方法的实现,该函数式接口定义了它的目标类型. 只有在定义了lambda表达式 ...

  8. Java线程知识拾遗

    知识回顾 进程与线程是常常被提到的两个概念.进程拥有独立的代码段.数据空间,线程共享代码段和数据空间,但有独立的栈空间.线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程.多线程和多进程都 ...

  9. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

随机推荐

  1. 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的任务管理器的性能面板,显示磁盘数据

    运行[diskperf -y],关闭任务管理器,重新打开即可.

  2. 让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解

    做吸顶效果或是固定效果时,使用position:fixed无非是最方便的,可是万恶的IE6是没有fixed这个属性值的,而我们要使IE6能够像fixed一样固定在浏览器中的某个位置,使用onscrol ...

  3. iOS文档序列化(对象归档)

    对象归档: 概念: 对象归档是指将对象写入文件保存在硬盘,当再次又一次打开程序时,能够还原这些对象.也称:对象序列化.对象持久化. 数据持久性的方式(事实上就是3类) 1,NSKeyedArchive ...

  4. 等差数列6《MAC》

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXhzdGFycw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  5. 屏幕录制H.264视频,AAC音频,MP4复,LibRTMP现场活动

    上周完成了一个屏幕录制节目,实时屏幕捕获.记录,视频H.264压缩,音频应用AAC压缩,复用MP4格公式,这使得计算机和ios设备上直接播放.支持HTML5的播放器都能够放,这是标准格式的优点.抓屏也 ...

  6. delphi字符串函数大全

    转帖:delphi字符串函数大全 2009-11-17 16:43:55 分类: delphi字符串函数大全 ━━━━━━━━━━━━━━━━━━━━━首部 function StringToGUID ...

  7. Mock原理学习

    同事搓蛋问了我一个问题,mock的原理是啥,没怎么想出来,于是花了点时间学习了一下. 从Moq这个库入手:https://github.com/moq/moq4 Moq用到了Castle的库用于Dyn ...

  8. Extjs树形控件入门

    Extjs树形控件由Ext.tree.TreePanel类定义,控件的名称为TreePanel,TreePanel继承自Panel类,在Extjs中使用树形控件其实很简单. 大家知道要使用Extjs必 ...

  9. iOS基础 - UIDynamic

    一.UIKit动力学 UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是 ...

  10. 初探performance.timing API

    初探performance.timing API   浏览器新提供的performance接口精确的告诉我们当访问一个网站页面时当前网页每个处理阶段的精确时间(timestamp),以方便我们进行前端 ...