Java面经之线程(1)

Java面经-线程

Java线程

并发处理的广泛使用是Amdahl定律代替摩尔定律称为计算机性能发展源动力的根本原因,是人类压榨计算机运算能力最有力的武器
Amdahl定律通过系统并行化与串行化的比重来描述多处理器系统能获得的运算加速能力,摩尔定律则用于藐视晶体管数量与运行效率之间的发展关系。

Java虚拟机的内存模型

处理器 <–>高速缓存 <–> 主内存

1.Java程序执行顺序

程序执行顺序,并不能直接通过程序代码就能保证程序执行顺序,所以Java虚拟机的即时编译器中自带指令重排序优化命令。

2.Java主内存与工作内存之间的交互操作

内存之间交互有8种操作,分别是load,stroe,read,write,user,assign,lock,unlock,要进行主内存和工作内存之间的交换,就必须保证这些操作之间的原子性,即read,load不可分,store,write不可分,一个内存read之后就必须load。这些操作在JDK6之后就已经改为4种,并且具体内存间是如何实现操作原子性的是不需要程序员来考虑的。

3.volatile变量规则

一般程序员都只使用synchronizd来进行同步,但了解volatile有很大好处

第一点,volatile变量具有可见性,即一旦变量在某个线程被修改,对其他线程是可见的
第二点,volatile变量禁止指令重排序优化,它通过设置内存屏障将它的上下代码进行阻隔,以禁止来自JVM的指令重排序

通过这两点volatile实现了最轻量级的同步机制,虽然不经常用它,但是请记住它的特点。

4.并发过程需要处理的三大特性:原子性,可见性,有序性

1.原子性

由Java内存模型直接保证原子性操作的有 read, load, assign, use, store, write。我们一般认为基本数据类型的操作都是具有原子性的,但是对于非基本数据类型,就需要另外两个操作,lock和unlock来进行了。

这两个操作Jvm并没有直接开放给程序员,而是提供了它的更高层Java代码——synchronized关键字,所以用synchronized关键字修饰的同步代码块就具有了原子性

2.可见性

可见性的意义刚刚已经提过了,即一个线程更改共享变量值时,其他线程可以立马得知这个变量被修改了。
那么被JVM提供能实现可见性的Java代码有那些呢?

1.刚刚提到的volatile
2.同步代码关键字synchronized
3.final

这三个关键字前两个都已经介绍了,最后一个final修饰的变量是线程安全里最高级的变量,即不可变变量,用final修饰以后变量不可变当然就具有了可见性了。

3.有序性

Java程序在本线程内观察,所有操作都是有序的,但是如果在一个线程中观察另一个线程,那么所有操作都是无序的。

出现这种情况的原因就是JVM的指令重排序功能引起的,那么如何让其他线程也能观察到有序的本线程呢?

就需要通过volatile和sychronized两个关键字来完成了。

volatile是通过禁止指令重排序进行程序的有序操作,而synchronized是通过加锁来保证一个变量同一时刻只有一个线程在访问来实现。

5.Java线程实现

在Java代码层面上实现线程有两种方法,第一种是extends Thread ,另一种是Implements Runnable,相比较而言,接口方法更实用,因为接口的实现不受Java虚拟机单继承的限制。

接下来说一说底层JVM上的线程实现

JVM中线程实现有三种方式,1.内核kernel线程实现,2.用户user线程实现,3.混合线程实现

1.内核线程是由操作系统内核直接支持的线程,一个内核线程对应一个轻量级线程,内核(CPU)操纵调度器对线程进行调度,由于基于内核线程实现,所以各种线程操作都需要进行系统调用,那么就需要在系统用户态和内核态之间进行切换,浪费了大量资源,降低了效率

2.用户线程是直接在用户态进行线程的建立,同步和销毁,不需要内核的帮助,一个进程就可以控制多个用户线程,再由一个内核控制多个进程。
但缺点同样明显,就是所有线程的创建,销毁,切换全需要用户来完成,没有内核的帮助

3.混合实现 即内核线程和用户线程的混合,许多操作系统都提供了这种混合线程的模型。

当然具体线程在JVM底层是如何调度的,在Java程序的编码和运行过程中是体现不出来的。

6.线程调度

线程调度有两种,一种是抢占式,一种是协程式,现在大部分都是采用的抢占式调度。
协程式用的不多,就不记录了

7.状态转换

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值