代码改变世界

操作系统原理之线程的分类:用户级线程和内核级线程

2022-11-28 19:45  杭伟  阅读(205)  评论(0编辑  收藏  举报

本篇文章作为Java并发编程的前置重点知识,有助于理解乐观锁和悲观锁。

 

这个世界上只有两种锁-->

乐观锁:指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。

悲观锁:指的是在操作数据的时候比较悲观,悲观地认为别人一定会同时修改数据,因此悲观锁在操作数据时是直接把数据上锁,直到操作完成之后才会释放锁,在上锁期间其他人不能操作数据

 

Java中大部分都是悲观锁,很多悲观锁本身也有一定的缺点,缺点即是:用户态和内核态的频繁切换消耗性能。

在这种背景下,乐观锁的思想应运而生。

 

再回到本篇主题。

用户级线程:应用程序管理的线程;优点:不需要内核模式特权,线程之间切换速度很快(不需要到内核态),

内核级线程:操作系统内核管理的线程,内核线程切换速度慢。

**用户线程完成系统调用的时候,还是要切换回用户态,继续执行代码的。

 

更多关于用户级线程和内核级线程,请移步

 

状态切换:

1,系统调用

比如:读写文件,申请内存(new对象时)等等,具体包括 进程、文件、设备、信息、通信等情况;

2,中断

3,异常

用户线程的阻塞和唤醒会映射到内核线程上,容易频繁引起内核态和用户态的切换。

比如Java中:AQS是基于用户态函数级别的锁;而jdk1.6之前的synchronized就是内核级别的重量级锁,本身会引起用户态到内核态的频繁切换。

(AQS中的挂起操作也涉及线程状态切换,但是AQS进行加锁的动作是通过一个声明为volatile的state关键字来控制)