java的线程模型

一、 java线程

new thread() ,一个java程序可以启动很多线程
这些线程在操作系统OS的级别

JVM可以启动很多java线程T,这些线程在操作系统的这个级别怎么运行?
java的线程模型,它的一个底层机制。
jvm虚拟机规范没有作出要求。
你一个线程,占了这种JVM级别的这种线程,它在操作系统的级别,底层
怎么样实现,没有作出具体要求。
hotspot是Oracle对于jvm虚拟机的一种具体实现
一个线程,启动的时候对应的是操作系统级别,也有它的内核线程
操作系统它自己底层要实现的时候,管理的 是一系列的内核线程,
简单称之为 K , 操作系统级别的线程
这个实现叫做1:1 ,就是一个内核线程对应一个虚拟机级别的线程

1、java线程

java线程 类似于 Go语言的纤程(天生支持高并发)
hotspot偷懒,将线程调度交给了OS
我jvm级别出一个线程,我就直接启动一个操作系统级别的线程,
不需要在用户空间(APP)做一些线程方面的管理,线程锁或者线程调度好
都交给操作系统来帮我完成。
java线程模型 :重量级线程

2、纤程/协程

1.Go语言的纤程:

它的纤程是在操作系统,在用户空间(APP)这个级别做了很多管理操作,
它们之间的同步,通信都是在用户空间的,
纤程/协程:轻量级线程
Go自带线程池

3、java线程 纤程/协程 区别

二者区别是需不需要操作系统参与调度。
需要操作系统参与调度的,叫重量级(jvm自己内存足以完成)

重量级锁:操作系统的管理,你要申请线程锁,操作系统在内核给你申请好,
把你的对应的线程拿过来放到队列里进行管理。需要OS管理
轻量级锁:我jvm,我在我自己的内存空间完全足以完成。

二、对象在内存中的存储布局

对象 new object()会在内存中开辟出一段空间
普通对象分四部 16个字节
markword 标记字 占8字节 64位虚拟机,主要记录锁信息。hashcode,GC
class pointer 类型指针 属于哪个类 Object.class/T.class
instance data 实例数据 成员变量 一个类T,里面一个成员变量 int类型 m
padding 对齐 8字节对齐 ,(装配效率会特别高)

针对markword
无锁状态 001

偏向锁 101

轻量级锁
自旋锁 00

重量级锁 10

GC标记 11

三、锁问题 什么时候轻量级锁升级成重量级锁

1、偏向锁:偏向第一个进去干事的,加的锁,优先给他上偏向锁

比方说上厕所,A直接把名字贴上去,不跟其他线程竞争
严格意义上偏向锁也不能算是一把锁,只能说做了一个记录,一个标志
专业描述:当前线程的指针被记录在markword里面

(1)提高效率的点在于,不需要锁竞争。只需要第一个线程来,就直接上的

偏向锁,没有竞争这个过程,就少了同步,效率就会提升

(2)为什么设计偏向锁

就算你调用synchronized的时候,也只有一个线程在运行,
大多数调查,vector ,hashtable,stringbuffer ,自带synchronized
但大多数时间只有一个线程在运行这些上了锁的方法,没必要参与竞争
如果不实际偏向锁,只要看到synchronized以来就去竞争,效率显然变低


当第二个人来的时候,就会进行锁升级,轻量级,叫自旋锁
大家一块抢,转圈抢。【细节:开始是A占得偏向锁,几个人竞争他优先】
此时,偏向锁升级为自旋锁
两个人(B、C)在外面转圈,一旦A出来,B跟C经过CAS操作,将自己的线程ID往上记录

2、重量级锁

调用wait(),notify()的时候已经进入重量级状态,
这把锁附着一个队列,这里面的线程都得去排队,叫等待队列

3、自旋锁、重量级锁区别

两者的区别是,自旋锁,会绕着厕所转圈,不排队,就在那抢
第二个等待队列,等着被召唤。
自旋锁, 线程等待的时候消耗CPU资源
重量级锁,线程等待不需要消耗CPU资源

四、用户态 内核态

一个应用程序干掉一个操作系统

操作系统 应用程序
OS 同权 APP
操作系统OS,应用程序APP都可以访问同一块内存
应用程序APP不怀好意,直接将操作系统内存干掉(改了内部的值)
or
操作系统OS,应用程序APP都可以控制硬件,把某个硬件直接干掉
例如硬盘给你格式化等等。操作系统、应用程序没有区分开,往往会诞生
经常操作系统运行着某程序就死机了,就蓝屏了


目前都做了分权处理,大概意思就是,
将操作系统OS的权重等级提高了,操作系统能干的事,应用程序是不能干的
比方说,直接跟硬件打交道,接受网络的数据,直接访问内存。例如,跟
键盘或者显示器打交道。


写程序也能实现,应用程序控制键盘或者显示器什么的。
此时由于操作系统OS的权重降低,应用程序被认为是跑在操作系统的外围
需要跟硬件打交道的地方,都要经过操作系统帮忙才可以。
你写得应用程序都需要调用操作性对外所提供的那些个库函数/系统函数
你得需要通过操作系统OS提供这些个核心的功能,才能完成自己想完成的
一系列操作。
然后我们就说,操作系统工作在内核态,应用程序工作在用户态


操作系统能管理的东西比较底层跟直接。不让我们的应用程序直接去干掉我们那些个硬件
从这点看,我们的操作系统会更加安全

疑问

自选锁一定比重量级锁效率高吗?
不一定。
如果两三个人上厕所,加上效率都很快,转悠两圈都解决了,效率很高
如果一个人上厕所,便秘,一万个人在等着,一直转圈,cpu全消耗在转圈了
效率很低,应该进入重量级锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值