首页 > 技术文章 > 线程基础概念回顾(一)

szz1113 2019-12-11 14:05 原文

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,

推荐阅读