Java 线程的几种状态及线程安全问题

所有线程状态 :
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:销毁状态,线程执行完毕

线程状态转变 :

 线程安全问题 :

概念:线程不安全指的是程序在多线程的执⾏结果不符合预期。

1.抢占式执⾏;

2.多个线程修改同⼀个变量

3.⾮原⼦性操作

⽐如 n++,其实是由三步操作组成的:

1.从内存把数据读到 CPU

2. 进⾏数据更新

3.把数据写回到 CPU

不保证原⼦性会给多线程带来什么问题?
如果⼀个线程正在对⼀个变量操作,中途其他线程插⼊进来了,如果这个操作被打断了,结果就可能是错误的。
4. 内存可⻅性
可⻅性指, ⼀个线程对共享变量值的修改,能够及时地被其他线程看到。
当线程要修改⼀个共享变量的时候, 也会先修改⼯作内存中的副本, 再同步回主内存.
由于每个线程有⾃⼰的⼯作内存, 这些⼯作内存中的内容相当于同⼀个共享变量的 "副本". 此时修
改线程1 的⼯作内存中的值, 线程 2 的⼯作内存不⼀定会及时变化.
5. 指令重排序
编译器优化的本质是调整代码的执⾏顺序,在单线程下没问题,但在多线程下容易出现混乱,从⽽
造成线程安全问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值