没有合适的资源?快使用搜索试试~ 我知道了~
Java线程实现与安全
0 下载量 169 浏览量
2021-01-27
14:53:23
上传
评论
收藏 108KB PDF 举报
温馨提示
试读
3页
首先并发并不是我们通常我们认为的必须依靠线程才能实现,但是在Java中并发的实现是离不开线程的,线程的主要实现有三种方式:使用内核线程(KernelThread,KLT)实现使用用户线程实现使用用户线程加轻量级进程混合实现直接由OS(操作系统)内核(Kernel)支持的线程,程序中一般不会使用内核线程,而是会使用内核线程的高级接口,即轻量级进程(Light WeightProcess,LWP),也就是通常意义上的线程。每个轻量级线程与内核线程之间1:1的关系称之为一对一的线程模型。优点:每个LWP是一个独立调度单元,即使阻塞了,也
资源详情
资源评论
资源推荐
Java线程实现与安全线程实现与安全
一、线程的实现
1、线程的三种实现方式
首先并发并不是我们通常我们认为的必须依靠线程才能实现,但是在Java中并发的实现是离不开线程的,线程的主要实现有
三种方式:
使用内核线程(Kernel Thread,KLT)实现
使用用户线程实现
使用用户线程加轻量级进程混合实现
(1)使用内核线程(Kernel Thread,KLT)实现:
直接由OS(操作系统)内核(Kernel)支持的线程,程序中一般不会使用内核线程,而是会使用内核线程的高级接口,即轻
量级进程(Light Weight Process,LWP),也就是通常意义上的线程。
每个轻量级线程与内核线程之间1:1的关系称之为一对一的线程模型。
优点:每个LWP是一个独立调度单元,即使阻塞了,也不会影响整个进程。
缺点:需要在User Mode与Kernel Mode中来回切换,系统调用代价比较高;由于内核线程的支持会消耗一定的内核资源,因
此一个系统支持轻量级进程的数量是有限的。
(2)使用用户线程实现:
广义上来说,一个线程只要不是内核线程就可以认为是用户线程(User Thread,UT),但其实现仍然建立在内核之上;狭义
上来说,就是UT是指完全建立在用户空间的线程库上,Kernel完全不能感到线程的实现,线程的所有操作完全在User Mode
中完成,不需要内核帮助(部分高性能数据库中的多线程就是UT实现的)
缺点:所有的线程都需要用户程序自己处理,以至于“阻塞如何解决”等问题很难解决,甚至无法实现。所以现在Java等语言中
已经抛弃使用用户线程。
优点:不需要内核支持
(3)使用用户线程加轻量级进程混合实现:
内核线程与用户线程一起使用的实现方式,而OS提供支持的轻量级进程则是作为用户线程与内核线程之间的桥梁。UT与LWP
的数量比是不定的,是M:N的关系(许多Unix系列的OS都提供M:N的线程模型)
2、Java线程的实现与调度
(1)Java线程的实现:
OS支持怎样的线程模型,都是由JVM的线程怎么映射决定的。
在Sun JDK中,Windows与Linux都是使用一对一的线程模型实现(一条Java线程映射到一条轻量级进程之中);
在Solaris平台中,同时支持一对一与多对多的线程模型
(2)Java线程调度:
是指系统内部为线程分配处理使用权的过程,主要调度分为两种,分别是协同式线程调度和抢占式线程调度。
1)协同式调度:线程执行时间由线程本身控制,线程工作结束后主动通知系统切换到另一个线程去。
① 缺点:线程执行时间不可控,切换时间不可预知。如果一直不告诉系统切换线程,那么程序就一直阻塞在那里。
② 优点:实现简单,由于是先把线程任务完成再切换,所以切换操作对线程自己是可知的。
2)抢占式调度:线程执行时间由系统来分配,切换不由线程本身决定,Java使用就是抢占式调度。并且可以分配优先级
(Java线程中设置了10中级别),但并不是靠谱的(优先级可能会在OS中被改变),这是因为线程调度最终被映射到OS
上,由OS说了算,所以不见得与Java线程的优先级一一对应(事实上Windows有7中,Solairs中有2的31次方)
二、线程安全
1、Java中五种共享数据
(1)不可变:典型的final修饰是不可变的(在构造器结束之后),还有String对象以及枚举类型这些本身不可变的。
weixin_38677808
- 粉丝: 2
- 资源: 939
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0