一. OSCache业务场景
1 ) . 解决系统性能问题,采用OScache缓存的注意要点 :
1. 代码完全正确的情况下取不到缓存的数据原因有可能是每次缓存都调用一个新的缓存对象方法导致的2. 采用单例模式解决,通过采用单例模式封装一个单例工具类来调用OScache ,但并发时还会出现问题
3. 这时直接采取DCL(双重判定锁),
小结 :
1. 单例模式封装了工具类,既解决了线程安全的问题,相对性能也得到了完善的解决
二. 线程描述
1 ) .线程的五种状态及相互转换
1. 新建状态(New) : 创建了一个线程对象2. 就绪状态(Runnable) : 线程对象创建后,其他线程调用该对象的start()方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权
3. 运行状态(Running) : 就绪状态的线程获取了CPU,执行程序代码
4. 阻塞状态(Blocked) : 阻塞状态是线程因为某种原因放弃CPU使用权.暂时停止运行,直到线程进入就绪状态,才有机会转到运行状态
5. 死亡状态(Dead) :线程执行完了或者因为异常退出了run()方法,该线程结束生命周期
2 ) .阻塞的情况分为三种 :
4.1. 等待阻塞 : 运行的线程执行wait()方法,JVM会把该线程放入到等待池中4.2. 同步阻塞 : 运行的线程在获取对象的同步锁时.若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
4.3. 其它阻塞 :
运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态
当sleep()状态超时,join()等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态
3 ) . 实现线程的两种方式 :
1. 继承Thread类2. 实现Runnable接口
无论怎样,当nwe了这个对象后,线程就已经进入了初始状态
4 ) .wait和sleep的区别 :
1. 线程访问 : 锁池状态,之后等待锁释放,然后访问代码2. wait :
等待队列(释放资源)-->调用notify或者notifyall之后琐池状态-->(等待锁释放)-->可运行状态-->运行状态-->访问代码
3. sleep,join :
不释放资源-->结束后直接进入可运行状态-->运行状态-->访问代码
5 ) .线程(Thread)与进程(Process)的区别 :
1. 线程的定义是应用程序与应用程序之间的边界,通常说一个进行就代表了一个与之对应的应用程序; (一线程就是一程序)2. 不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间 (一进程可以说是一软件)
3. 一个进程可以包含若干个线程,同时可创建多个线程来完成某任务,也就是多线程 (进程包含线程)
小结 :
1. 一个java控制台程序,默认运行两个线程,一个主线程,一个垃圾回收线程