所有线程状态 :
public class Test { public static void main(String[] args) { for (Thread.State item : Thread.State.values()) { System.out.println(item); } } }
NEW:线程被创建,调用start()前;
RUNNABLE:运行状态;
BLOCKED:阻塞,线程进入等待状态;
WAITING:等待状态
TIMED_WAITING:超时等待状态,超时以后自动返回
TERMINATED:销毁状态,线程执行完毕
线程状态转变 :
![](https://i-blog.csdnimg.cn/blog_migrate/f6c88ae97978c7b674aa8e772f779086.png)
线程安全问题 :
概念:线程不安全指的是程序在多线程的执⾏结果不符合预期。
1.抢占式执⾏;
2.多个线程修改同⼀个变量 ;
3.⾮原⼦性操作
⽐如 n++,其实是由三步操作组成的:
1.从内存把数据读到 CPU
2. 进⾏数据更新
3.把数据写回到 CPU
不保证原⼦性会给多线程带来什么问题?
如果⼀个线程正在对⼀个变量操作,中途其他线程插⼊进来了,如果这个操作被打断了,结果就可能是错误的。
4.
内存可⻅性
可⻅性指, ⼀个线程对共享变量值的修改,能够及时地被其他线程看到。
当线程要修改⼀个共享变量的时候, 也会先修改⼯作内存中的副本, 再同步回主内存.
由于每个线程有⾃⼰的⼯作内存, 这些⼯作内存中的内容相当于同⼀个共享变量的 "副本". 此时修
改线程1 的⼯作内存中的值, 线程
2
的⼯作内存不⼀定会及时变化.
5.
指令重排序
编译器优化的本质是调整代码的执⾏顺序,在单线程下没问题,但在多线程下容易出现混乱,从⽽
造成线程安全问题。