30. Java IO与NIO

NIO,全称non-blocking IO,由jdk1.4推出,它是一种非阻塞的IO方式,为所有的基本类型提供了缓存支持。

IO操作包括,对硬盘的读写,对socket的读写及外设的读写。

阻塞和非阻塞
阻塞:当某个事件或任务执行过程中,它发出一个请求操作,当该请求所需的条件不满足时,该事件会一直停留在这里,等待直到条件满足。

非阻塞:当某个事件或任务执行过程中,它发出一个请求操作,当该请求所需的条件不满足时,会立即返回一个标志信息告知条件不满足,不会一直等待条件满足。

阻塞IO和非阻塞IO
当用户发起一个IO请求操作,内核会去查看要读取的数据是否就绪。
对于阻塞IO,如果数据没有准备就绪,就一直等待知道数据就绪。
对于非阻塞IO来说,如果数据没准备就绪,就返回一个标识信息告诉用户线程当前的数据没有准备就绪。数据准备就绪后,便将数据拷贝到用户线程,完成一整个完整的IO请求操作。

完整的IO请求包括两个阶段:
1)查看数据是否就绪
2)进行数据拷贝(内核将数据拷贝到用户线程)

阻塞IO和非阻塞IO区别在于第一个阶段,没有数据的时候是一直等待还是返回一个标志信息。

同步IO和异步IO:
从字面的意思可以看出:同步IO即 如果一个线程请求进行IO操作,在IO操作完成之前,该线程会被阻塞;
  而异步IO为 如果一个线程请求进行IO操作,IO操作不会导致请求线程被阻塞。
  事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
  对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
  而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。

2016/10/9 11:18 上午 posted in  Java

29. foreach与正常for循环效率对比

for foreach
跳跃访问
修改当前访问值 能(但不能删除)
集合类型 效率稍高 稍低
数组类型 效率稍低 稍高
链表LinkedList 稍低 稍高

两种方式在遍历数组的时候时间普遍都较快,在遍历集合的时候耗时会更久一些。在遍历数组时,foreach的表现要稍微好一点,在遍历集合的时候,for的表现要好一点。但是不管哪种情况,for和foreach这两种遍历方式时间都相差不大。因此对于这两者的比较在时间效率来说应该相差不会很大(上面没有测试复杂数据的情况,以及其他集合结果的情况,可能不准确)。主要是在对于两者的应用场景上的选择:
(1)普通for循环可以根据下标来访问;
(2)foreach在代码结构上更加清晰、简单;
(3)foreach在遍历的时候会锁定集合中的对象,期间不能修改,而for能对集合中的元素进行修改。

2016/10/8 17:4 下午 posted in  Java

28. wait()和sleep()的区别

wait() sleep()
原理 Object的方法,用于线程通信 Thread的静态方法
对锁的处理机制 释放资源给其它线程使用,在调用notify或notifyAll之后,重新参与争夺资源 只是放cpu,时间到即恢复运行,不涉及线程通信
使用区域 必须在同步控制方法或语句块中使用(synchronized) 可在任何地方
sleep yield
运行机会 会给低优先级的线程机会运行 只给相同优先级或更高的线程运行
转入状态 使线程转入阻塞状态,短时间内部执行 使线程转入可执行状态,可参与竞争cpu,所以可能该线程立即又被执行
异常 抛出InterruptedException
移植性 比yield高 与操作系统相关
2016/10/8 16:57 下午 posted in  Java