JAVA高级特性总结

1.File类可以完成对文件、目录的操作,新建、删除、重命名文件、目录等,但不能访问文件本身的内容,访问文件本身内容需要使用输入输出流,对于Java来说文件和目录都是一个概念。

2.Window的路径分隔符使用反斜线(\),而Java的程序中反斜线表示转义字符,所以如果要使用反斜线应该用两条线(\\),或者只是用正斜线(/)。

3.字节流一InputStream和OutStream作为基类,字节流的最小数据单元是8位,字符流的最小 数据单元是16位,字符流则以Reader和Writer作为基类。

4.使用处理流的一个明显好处是:只要使用相同的处理流,程序就可以采用完全相同的输入输出代码来访问不同数据源,随处理流包装节点流的改变,程序实际所访问的数据源也相应发生改变。这是一种典型的装饰器设计模式。

5.使用Java的IO流执行输出时,必须要关闭输出流,以保证程序正常。

6.由于PrintStream类的输出功能非常强大,通常如果我们要输出文本内容,应该使用处理流PrintStream来包装OutStream后进行输出。包装方法:

//创建字节流

FileOutStream fos=new FileOutputStream(“t.txt”);

//进行包装

Ps=new PrintStream(fos);

7.字节流、字符流的使用规则:如果输入输出的内容是文本内容使用字符流,如果进行输入输出二进制内容使用字符流。

8.InputStream和Reader都为抽象类,本身不能创建实例,但是它们分出有一个用于读取文件的输入流:FileInputStream和FileReader。

9.线程实现的两种方式:第一种是继承Thread类,重写其run方法。第二种是实现Runnable接口,实现run方法。

10.我们将希望的线程执行的代码放在run方法里,通过start的方法来启动线程,start方法首先为系统准备好资源,然后在调用run方法。当某个类继承了Thread类,那么就叫做线程类。

11.线程的停止是不可以使用stop方法的,一般设置一个变量,在run方法中时一个循环,每次检查这个变量,如果满足条件继续执行,否则停止线程。

12.Java中的每一个线程都有一个锁(lock)或监视器(monitor),当访问某个对象的synchronized方法时,表示对该对象上锁,任何其他线程都无法访问该对象的synchronized方法,直到这个线程执行完毕后,或者抛出异常后,表示对该对象释放锁,其他对象才可以访问该对象的synchronized方法。

13.如果某个synchronized方法是static的,那么线程在访问方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在对象所对应的class对象,因为无论一个类有多少个对象,这些对象会对应唯一一个class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行也是顺序的,也就是说一个线程先执行方法,执行完毕后另一个线程才开始执行。

14.synchronized块:写法:

synchronized(object){

 

}表示在执行的时候对object对象上锁。

15.synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法,synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的代码是可以被多个线程同时访问的。Synchronized里的数据必须是private类型的。

16.在项目中使用synchronized有时候是存在问题的,如果这个项目比较耗时,项目中涉及算法并且存在并发问题,那么当一个线程在执行时,其他线程就必须等待,一个线程执行的时间较长;比如20秒,那么下一个线程就得等待20秒,再下一个就得等待40秒,以此类推,最后一个线程会等待很久。这时就需要使用wait()和notify()方法这两个方法必须都在synchronized修饰的方法里同时使用。

17.wait和notify方法都是定义在Object类里的,Object类里的各个方法都是非常有用的,而且这两个方法都是final的,所以可以被所以的java类继承,但是无法重写,这两个方法在使用线程应该已经获得了对象的锁,因此对这两个方法的调用要放在synchronized方法或块中,当线程执行wait方法时,它会释放掉对象的锁

18.   另一个会使线程等待的方法是sleep方法,它会导致线程睡眠指定的毫秒数,但是线程在睡眠的过程中是不会释放对象的锁的。

你可能感兴趣的:(Java)