CPU性能压榨
程序:XX.exe
进程:操作系统对程序分配资源的基本单位
(一个进程中可以包含多个线程)
线程:调度执行的基本单位(多个线程共享进程的资源)
线程切换:会消耗资源(线程上下文切换)
CPU密集型:计算
IO密集型:等待输入、输出,拷贝
单核CPU也可以设定多线程(在线程等待期间,可以执行其他线程)
工作线程并不是越大越好,根据CPU核数和压测,以及预留
N线程数=N物理核数U期望利用率(1+W等待时间/C计算时间)
接口比类更灵活
线程6种状态:
如何让优雅的停止一个线程?为什么不建议用stop方法?
自然结束
使用volatile+无限循环的方式;设置标志位(interrupt,interrupted)
因为它不会处理善后工作,可能会破坏原本程序保护的一致性的代码。
并发编程三大特性:
可见性:volatile
有序性:
原子性:
CPU1、2、3级缓存,缓存行、伪共享、64byte:除了前后怼变量外,还可以添加@Contended(只有JDK8有效)(启动参数需要添加:-XX:-RestrictCotended)
乱序存在的条件
as-if-serial
不影响单线程的最终一致性
java中4种引用:强软弱虚
强:声明变量,Object obj == new Object();
软:SoftReference so = new SoftReference(obj);(只有在内存不够时,才会回收,类似一个泛型集合,可以当做缓存)
弱:WeakReference we = new WeakReference(obj);(遇到gc就会被回收掉,常用在容器中,ThreadLlocal中就有用到)
虚:PhantomReference ph = new PhantomReference(obj,queue);(遇到gc就被回收,方进入的参数无法获取和使用,只是在对象被gc回收的时候,会在队列中放一条消息,常用于编写jvm的人员,也可以在NIO时用于回收堆外内存)