线程状态和线程安全

thread类里面有个thread state 里面封装线程状态

1 NEW 未启用状态 2RUNNABLE状态 正在运行状态 3 BLOCKDE 轮到执行了但是cpu没有空闲,所以出于受阻状态 4 WAITING 等待执行状态(什么时候唤醒什么时候再执行)  5 TIME WAITING休眠多久之后再执行的状态 6 TERMINATED 退出线程的状态。

我们可以获得这六种状态之间的关系 启用状态之后 cpu有空去执行 就会进行正在执行状态,没有空去执行就会进入受阻状态 执行结束之后就会进入死亡状态 我们主动放弃执行权限的时候wait()方法就会进入等待状态,再次得到执行权限notify()就会进入正在执行状态,cpu没有空空闲时就会进入受阻状态,休眠多少分钟的状态调用sleep()方法等同于等待状态。因此我们可以得到这六种状态之间的关系图如下

我们举例卖电影票的情况,三种卖票方式 有100张电影票等待卖出。会不会出现最后一张票在三个平台同时被卖出的情况,这样就会产生第0张票和第-1张票,多线程操控共享数据的时候才会出现这类问题,这类问题就是我们的线程安全问题。

我们找到那段可能会导致出现的代码进行包裹来解决这类问题;java中提供了线程同步机制,它能够解决上述的线程安全问题。线程同步的方式有两种 1同步代码块 2同步方法 

1要在同步代码块加上synchronized 关键字 然后再添加一个锁对象,这个锁对象也是一个共享数据,保证多个线程时,要使用同一个锁对象才能保证线程的安全

2同步方法 在普通方法上加一个synchronized关键字,把可能会出现线程安全问题的代码进行包裹,再在run 方法中调用那个被synchronized修饰的普通方法

3 lock接口 在成员变量定义一个锁对象,在那段代码执行之前获取锁,执行结束的时候释放锁。

这里还涉及到前面所学的StringBuilder和stringbuffer的问题,前者快于后者,是因为后者保证了同步,确保了安全性。

posted @ 2021-03-02 11:18  Dyl啊  阅读(64)  评论(0)    收藏  举报