1,线程的实现方式,有三种:继承thread、实现runnable,使用jdk1.8的lambda方式实现thread;3:Executors.newCachedThrad 使用线程池创建
lambda表达式:例如 new Thread(()->{
System.out.println("my thread");
}
},"aa").start();
2,线程的常用方法:sleep、join、yield;
我的理解:
sleep---让线程睡一会,然后进入到Runable状态的就绪队列。
join---两个线程t1,t2,在t1中使用t2.join,t1线程会等待t2线程结束后在继续执行t1的后续逻辑。
yield---让一个线程短暂退出,进入runnable的就绪状态;重新进行排队等待
3,线程的状态转换,
a,新建线程对象时,此时的状态是new状态;
b,使用线程的start时,此时的状态是Runnable;而runnable包含两个状态(就绪ready和运行running)
c,线程正常运行完毕时,结束状态;TERMINATED
从new状态到runnable有几种转换,timedWait、wait、block,如下图所示:
4,synchronize 的说明,同步锁,锁的是对象,不是代码;锁类中的方法,如果是静态的方法,锁的是该类的class对象,如果没有static,则锁的是该类的this对象。异常情况会释放锁。对String、Interge等常量不能使用synchornized,会有问题
升级锁的概念:偏向锁、自旋锁、重量级锁
偏向锁:默认第一个线程访问获得锁后,对象有两位设置01或者其他,默认为偏向锁。
自旋锁:当两个线程争夺锁时,自动升级为自旋锁,此时还在cpu这边处理,未到wait等待序列中;默认自旋10次后,还没有获得锁,则升级到重量级锁
重量级锁:在等待序列中。
使用情况:
线程少,处理速度时间短,用自旋锁
线程多,处理时间长,用重量级锁。
5,volatile :线程可见性、禁止指令重排序;
6,AtomicXXX:CAS(无锁优化、乐观锁、自旋)
7,LongAdder:分段锁、CAS原理
8,