我真是个懒孩子,不过总算又整理了一波,现在算是对操作系统的基本知识有一定的了解了,继续加油,下一批的是操作系统和tcp/ip的,毕竟网络协议之类的总在笔试看到(>人<;),任重而道远!!
--------------我是萌萌哒的分割线-------------
21.实现多线程的两种方法:Thread与Runable。
继承Thread类。:1,定义类继承Thread。2,复写Thread类中的run方法。目的:将自定义代码存储在run方法。让线程运行。//run();仅仅是对象调用方法。而线程创建了,并没有运行。
3,调用线程的start方法,
实现Runable接口:1,定义类实现Runnable接口(实现的好处:避免了单继承的局限性。)2,覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中。3,通过Thread类建立线程对象。4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
实现Runnable接口相对于继承Thread类来说,有如下的显著优势:
1.适合多个相同代码的线程去处理同一个资源的情况
2.可以避免由于java的单继承特性带来的局限
3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
22.线程同步的方法:synchronized、lock、reentrantLock等。
synchronized: 在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好
ReentrantLock:提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
Atomic: 和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
所以,我们写同步的时候,优先考虑synchronized,如果有特殊需要,再进一步优化。ReentrantLock和Atomic如果用的不好,不仅不能提高性能,还可能带来灾难。
23.锁的等级:对象锁、类锁
对象锁
当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只由一份。
注意,如果这个类有两个实例,比如:ClassA a = new ClassA();ClassA b = new ClassA();那么如果你在a这对象上调用了methodA,不会影响b这个对象,也就是说对于b这个对象,他也可以调用methodA,因为这是两对象,所以说对象锁是针对对象的
类锁
其实系统中并不存在什么类锁。当一个同步静态方法被调用时,系统获取的其实就是代表该类的类对象的对象锁
同时获取类锁和对象锁是允许的,并不会产生任何问题,但使用类锁时一定要注意,一旦产生类锁的嵌套获取的话,就会产生死锁,因为每个class在内存中都只能生成一个Class实例对象。
死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。(银行家算法,读者写者问题)
死锁问题需要满足以下条件:
1. 互斥条件:一个资源每次只能被一个线程使用。
2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要破坏死锁 4 个必要条件之一中的任何一个,死锁问题就能被解决。
http://blog.csdn.net/abigale1011/article/details/6450845避免死锁的方法,和打破上面条件的代价
24 写出生产者消费者模式 (多线程同步。
同步问题的解决方法一般是采用信号或者加锁机制,即生产者线程当缓冲区已满时放弃自己的执行权,进入等待状态,并通知消费者线程执行。消费者线程当缓冲区已空时放弃自己的执行权,进入等待状态,并通知生产者线程执行。这样一来就保持了线程的同步,并避免了线程间互相等待而进入死锁状态)
25.ThreadLocal的设计理念与作用:http://itfish.net/article/22032.html
ThreadLocal的作用就是将线程经常要用到的对象放到属于线程自己的内存空间里,在该线程的执行过程中,可以通过静态的ThreadLocal实例来方便的存取这个对象,而不用再通过参数的形式来回传递。
26.ThreadPool用法与优势。(线性池的使用:http://www.infoq.com/cn/articles/java-threadPool )
好处:
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
27.Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等
http://blog.csdn.net/windsunmoon/article/details/36903901 (太多了,不用看)
28.wait()和sleep()的区别
wait(),调用一般形式 对象名.wait(),通常需要放入方法synchronize修饰的语句块或方法中。作用是把当前对象放入对象的等待集合中。
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源。
29.foreach与正常for循环效率对比
foreach和while的效率几乎是差不多的,而for则相对较慢一些。
foreach的内部原理其实还是 Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来方便的访问元素.foreach这种循环一般只适合做数组的遍历,提取数据显示等,不适合用于增加删除和使用下标等复杂的操作.
30、Java IO与NIO
面向流与面向缓冲
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
阻塞与非阻塞IO
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
选择器(Selectors)
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
31.反射的作用与原理。
java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到JVM中的类的内部信息,允许您执行程序时才得到需要类的内部信息,而不是在编写代码的时候就必须要知道所需类的内部信息,这使反射成为构建灵活的应用的主要工具。
反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。其中最核心的就是Class类,它是实现反射的基础
Java反射机制提供了一种动态链接程序组件的多功能方法,它允许程序创建和控制任何类的对象(根据安全性限制)之前,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。
32.泛型常用特点,List能否转为List。(不能)
通过传递不同类型的类型变量给泛型可以产生不同的JAVA类型。就是说List< String>和List< Object>的类型是不同的。尽管String是java.lang.Object。但是传递一个List< String>给一个参数是List< Object>的函数会参数会产生编译错误(compile error)。函数能用 ? 通配符使其接受任何类型的参数。List< ?> 意味着任何类型的对象。 (java泛型http://ludaojuan21.iteye.com/blog/247049 )
33.解析XML的几种方式的原理与特点:DOM、SAX、PULL(360笔试有)
34.Java与C++对比。 http://xinklabi.iteye.com/blog/657334
35.Java1.7与1.8新特性。
36. 设计模式:单例、工厂、适配器、责任链、观察者等等。(请看书《设计模式之禅》)
----------基础java阅读书籍(走过路过不要错过)--------
推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》