Java 常用类
String、StringBuilder 、StringBuffer
-
String 不可变字符序列
Sting str = ""; for(int i=0;i<5000;i++){ str = str + i; //相当于创建了10000个对象,大大影响了性能 }
-
StringBuilder 可变字符序列,线程不安全
-
StringBuffer 可变字符序列,线程安区
参考文章:StringBuilder和StringBuffer的区别
DateFormat和SimpleDateFormat
-
把时间对象按照“格式字符串指定的格式“转换响应的字符串
DateFormat df = new SimpleDataFormate("yyyy-MM-dd hh:mm:ss") String str = df.format(new Date());
-
把字符串按照“格式字符串指定的格式“转换响应成时间对象
DateFormat df2 = new SimpleDataFormate("yyyy年MM月dd日 hh时mm分ss秒"); Date date = df2.prase("1984年10月12时 10时45分59秒");
Enun类
枚举类的实例对象只能在eunm里面体现
Java 容器(集合)
HashMap源码解析:HashMap源码详解一篇就够
Java 泛型
Java IO
- 节点流
- 装饰流(处理流)
- 装饰者模式
参考文章:节点流和装饰流
Commons组件
- 封装了常用的方法
Java 多线程
线程状态
- new_新生:进入新生状态
- start:进入就绪状态
- sleep_暂停:由运行态变为阻塞态,资源不会被释放
- yield_礼让:由运行态直接变为就绪态
- join_插队:阻塞主线程,插队线程先执行
实现方法
- 继承Thead
- 实现Runnable接口
- lambda表达式
- Callable和Future
代理模式
- Runnable 接口实现类的启动方式
- 通过代理角色代理真实角色实现一些方法
Synchronized 线程同步
-
同步块:synchronized (obj) { },obj称为同步监视器
- obj可以是任何对象,但是推荐使用共享资源作为同步监视器
-
同步方法
- 同步方法中无需指定同步监视器,因为同步方法的同步监视器是this既同步对象本身,或class既类的模子
-
同步监视器的执行过程
- 第一个线程的访问,锁定同步监视器,执行其中的代码
- 第二个线程访问,发现同步监视器被锁定,无法访问
- 第一个线程访问完毕,解锁同步监视器
- 第二个线程访问,发现同步监视器未锁,锁定并访问
-
性能分析
-
死锁:过多的同步可能造成相互不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁
- 避免:不要在同一个代码块中,同时持有多个对象的锁
-
生产者消费者
- 管程法:借助缓冲区
- 信号灯法:借助标志位
-
定时调度
- Timer() 和 TimerTask()
- quartz
-
HappenBefore:指令重排
-
volitale:用于保证数据的同步,也就是可见性。
ThreadLocal
- ThreadLocal能够放一个线程级别的变量,其本身能够被多个线程共享使用,并且又能够达到线程安全的目的
可重入锁
- 锁作为并发共享数据保持一致性的工具,大多数内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的琐时,那么这个请求会立即成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。如果没有可从如锁,在第二次企图获得琐时,将会进入到死锁状态。
原子操作
线程试图获取一个已经由它自己持有的琐时,那么这个请求会立即成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。如果没有可从如锁,在第二次企图获得琐时,将会进入到死锁状态。