要了解多线程,先需要把java线程模型搞清楚,否则有时候很难理清楚一个问题。

硬件多线程:

物理机硬件的并发问题跟jvm中的情况有不少相似之处,物理机的并发处理方案对于虚拟机也有相当大的参考意义。在买电脑或者自己diy的时候经常看到商家的介绍,什么“4核8线程”,“8核16线程”;这里“核”是指cpu的核心数,所谓“4核8线程”就是将2个cpu放置到一个封装内,比如i7-7700k是4个cpu8线程,就是intel使用HT技术在单核内部仅复制必要的资源,让cpu模拟成两个线程,所以每个单核都是一个核心,两个逻辑线程,同一时刻可以处理两个线程的工作,模拟双核心双线程(这个地方,实际是intel在设计的时候,发现给核心输送数据的管线因为种种原因又长又窄,所以使得数据的传输有瓶颈,导致核心只有70%左右的时间在工作,那咋办呢,于是就另加了一条管线,这样就可以让cpu在两条管线之间切换处理任务,相当于全时工作,这两条管线就是逻辑核心,也就是所谓线程);一共4个核心,8个线程,所以叫4核8线程。而i5-8600k则是6核6线程,也就是没有采用模拟的双核封装技术,因此标语就是6核6线程。

7700k的默认频率是4.2Ghz,速度是非常快的,通常是比内存频率高的,而内存频率还要受限于主板(两者取最低值)。因此现在计算机都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cpu Cache不是cpu的寄存器,cpu要通过寄存器跟自己的高速缓存交互,高速缓存跟内存交互,内存跟硬盘交互)来作为缓冲,将运算需要使用的数据复制到缓存中,使得cpu无需等待较慢的内存。

基于高速缓存的存储交互很好的解决了处理器跟内存的速度矛盾,但也为计算机系统带来了更高的复杂度,因为它引入了另一个新的问题:缓存一致性。在多核系统中,当多个处理器的运算任务都涉及同一主内存区域时,将可能导致格子的缓存数据不一致,如果真的发生这种情况,该以谁的为准呢?为了解决这个问题,就需要各个处理器访问缓存时都遵循一些协议,读写时要依据这些协议来操作,这些协议有:MSI,MESI,MOSI,Synapse,Dragon等。除了增加高速缓存之外,处理器还可能会对输入的代码进行乱序执行优化,处理器会在计算后将结果进行重组,保证结果跟顺序执行是一致的。

java内存模型:

java虚拟机规范中视图定义一种java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现java程序在各种平台下都能达到一致的内存访问效果。从jdk1.5开始,java内存模型已经成熟和完善起来了。java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。注意,这里的变量不包括局部变量跟方法参数,这两个都是线程私有的,因此不存在并发问题。

java内存模型规定了所有变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作,读取赋值等都必须在工作内存进行,而不能直接读取主内存中的变量。不同的线程也无法直接访问对方工作内存的内容,线程间变量值的传递均需要经过主内存来完成。

这里有几个细节要说明:

1、这里说的主内存实际是物理内存的一部分,它位于jvm中,而jvm又在物理内存中,so~,不过是jvm中的一部分而已;

2、如果局部变量是引用类型,它引用的对象在java堆中可以被多个线程共享,但引用本身在jvm栈中的局部变量表中,它是线程私有的;

3、拷贝副本的问题,加入线程中访问一个10M的对象,也会把这个10M的内存复制一份拷贝出来吗?事实上并不会,这个对象的引用、对象中某个在线程访问到的字段是可能存在拷贝的,但不会有虚拟机实现成把整个对象拷贝一次。

4、java虚拟机规范规定,volatile变量依然有工作内存的拷贝,但由于它特殊的操作顺序性规定,所以看起来好像是直接在内存中读取一样。

从物理上讲,主内存主要对应java堆中的对象实例,而工作内存朱啊哟对应jvm虚拟机栈中的区域,而为了更好的运行速度,虚拟机可能会让工作内存优先存储于寄存器核高速缓存中,因为程序运行时主要访问的是工作内存嘛。当然这个过程未必是虚拟机做的,也可能是操作系统本身的优化使然。

java多线程模型_1、java线程模型相关推荐

  1. reactor线程模型_简单了解Java Netty Reactor三种线程模型

    1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...

  2. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  3. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

  4. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  5. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...

  6. Java 多线程(八) 线程状态图

    Java 多线程(八) 线程状态图 结合多线程的学习过程,介绍线程的状态图,随着学习的深入,这幅图不断加入新的内容. 一.线程基本状态图 这幅图是在Java 多线程(三) 线程的生命周期及优先级出现过 ...

  7. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  8. Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

    线程安全问题是多线程编程中最典型的一类问题之一.如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的. 通俗来说,线程不安全指的就是某一代 ...

  9. Java多线程(四)线程并发的理解

    前言 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. ----以上摘自百度百科 一.龟 ...

  10. 一篇文章弄懂Java多线程基础和Java内存模型

    文章目录 一.多线程的生命周期及五种基本状态 二.Java多线程的创建及启动 1.继承Thread类,重写该类的run()方法 2.通过实现Runnable接口创建线程类 3.通过Callable和F ...

最新文章

  1. nginx转发端口路由器再转发
  2. 重学ES6 函数的扩展(下)
  3. 02 - Unit010:关联映射
  4. javascript谜题
  5. 深入浅出讲解C语言#define宏定义应用及使用方法
  6. Oracle中两个重要的语句
  7. ie浏览器在线使用_关于登录深圳市住房公积金管理中心网站在线办理平台的温馨提示...
  8. Android事件传递机制【Touch事件】
  9. 下载python的步骤ios_如何使用 Python 开发 iOS 程序?
  10. html js 跳出框架,现在的web框架为什么把html和js又结合在一起了?
  11. html+css静态页面Demo(参考一唯科技官网)
  12. 第七次全国人口普查,数据来了!
  13. Linux虚拟机获取最高权限
  14. 六分解谜四分温情,浅谈《像素小屋》倍受新手解谜者的青睐的原因
  15. 【Python】常用中英文词汇对照
  16. Stellarium Windows/Linux编译记录
  17. python 小数点位数_python小数位数
  18. COCI 2016/2017 Round 4 C dp
  19. oracle中begin end的作用,如何在SQL * Plus中使用begin/end运行Oracle查询?
  20. 20181214-python-tips

热门文章

  1. 我在学python-我在大学毕业后学习Linux、python的一些经验
  2. 怎样学好python-零基础如何学好Python?
  3. python循环语句-python循环语句
  4. python百度百科api-Python即时网络爬虫:API说明
  5. java和python的web自动化有什么区别-Java 和 Python 有哪些区别?
  6. python3.5怎么安装pip-为python 3.5安装pip
  7. python批量下载文件-Python实现批量下载文件
  8. python编程和c语言编程的区别-C语言 python Java 等主要流行编程语言优劣对比
  9. python课程将主要介绍哪些内容-Python课程详细介绍
  10. python下载不了-python3下载不了