多线程的状态转移图
线程的七种状态:NEW,RUNNABLE,RUNNING,WAITING,TIMED_WAITING,TERMINATED,BLOCKED
线程安全
线程不安全:线程没有按照预期正常工作。
线程不安全的原因:共享资源/数据/变量
①私有数据不需要考虑线程安全问题,共享数据才是线程不安全的罪魁祸首
②线程之间会因为调度的原因,穿插着进行,数据的方法有一定的特殊规则(调度交叉执行)
③代码的原子性/内存的可读性/代码的重排序
a.原子性(atomic):一段代码运行期间是不能被分割的,一句java代码不一定就是原子的 原子性中不可再分的代码片段——临界区 保证线程安全:1)指令本身 2)加锁
b.内存的可见性:程序运行过程中Java只保证了单线程情况下工作内存中的数据是正确的,如果要保证多线程情况下,可以看到线程的工作情况(内存的变化就需要保证变量的可见性问题
c.①为什么要进行重排序:CPU/Javac编译器/运行时JIT对代码进行适当的优化 ②java规定了优化必须保证单线程情况下的正确性
如何保证线程安全:1.如果可以设计出不需要共享的数据,天生安全2.如果非要进行数据的共享,尽可能的保证数据的只读性——不可变对象3.利用各种机制保证原子性/可见性/重排序问题。
多线程(2)
最新推荐文章于 2023-02-21 22:25:00 发布