我们知道,一个进程对应一组PCB,那么PCB在操作系统内核中,它分为就绪队列和阻塞队列,采用双向链表进行管理。
线程有六种状态
NEW:操作系统内核未创建线程;
Terminated:线程运行结束,已销毁
Runnable:线程处于就绪态:1.已经在CPU上运行了;2.处在就绪队列中
Blocked: 这是调用了Sleep;
waiting:调用了wait方法
timed-waiting:线程调用sleep
前三种状态是主要状态;后面三种状态都是各种原因进行阻塞的状态。相应的代码如下:
public class Demo13 {
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(()->{
System.out.println("thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(thread.getState());//未创建线程的状态
thread.start();//启动线程
Thread.sleep(500);
System.out.println(thread.getState());
thread.join();//调用后结束线程
System.out.println(thread.getState());//线程销毁后的状态
}
}
多线程并发执行,提高了代码执行率,那么同样的也造成一些安全问题,原因如下:
1.操作系统的随机调度/抢占式执行【对于这种方式,我们是无能为力】
2.多个线程修改同一变量
解决方案:通过调整程序的设计,破坏上面的条件
3.部分修改操作TM不是原子的
解决方案:通过枷锁操作,就可以把一些不是原子的操作打包成一个原子操作
4.内存可见性
5.指令重排序
4和5的问题都是通过volatie关键字来进行解决。