要了解多线程,先需要把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虚拟机栈中的区域,而为了更好的运行速度,虚拟机可能会让工作内存优先存储于寄存器核高速缓存中,因为程序运行时主要访问的是工作内存嘛。当然这个过程未必是虚拟机做的,也可能是操作系统本身的优化使然。

 

1、java线程模型的更多相关文章

  1. eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结

    eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...

  2. Java线程模型

    并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...

  3. java线程基础知识----java线程模型

    转载自http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标 ...

  4. java并发笔记之java线程模型

    警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码: ...

  5. 七. 多线程编程2.Java线程模型

    Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程.实际上,Java使用线程来使整个环境异步.这有利于通过防止CPU循环的浪费来减少无效部分. 为更好的理解多线程环境的优势可以将它与它 ...

  6. java线程模型Master-Worker

    这样的模型是最经常使用的并行模式之中的一个,在Nginx源代码中有涉及到有想看的能够去这个大神的博客了解一下http://blog.csdn.net/marcky/article/details/60 ...

  7. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  8. Java线程面试题 Top 50 (转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html   本文由 ...

  9. 50 道 Java 线程面试题(转载自牛客网)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...

随机推荐

  1. web端访问文件没有权限的问题

    背景 : ftp的PHP项目中的某些文件没有写入的权限..系统报注意错误!!! 原因 : 一般情况下,web端访问网站一般使用的是WWW权限(有限制的权限组)去访问, 但是我们编程开发的时候, 有可能 ...

  2. Vue生命周期函数

    生命周期函数: 组件挂载,以及组件更新,组建销毁的时候出发的一系列方法. beforeCreate:实例创建之前 created:实例创建完成 beforeMount:模板编译之前 mounted:模 ...

  3. 20165219 2017-2018-2 《Java程序设计》第5周学习总结

    20165219 2017-2018-2 <Java程序设计>第5周学习总结 课本知识总结 第7章 内部类与异常类 一 1 内部类:类的一种成员 2 外嵌类:包含内部类的类称为内部类的外嵌 ...

  4. winform datagridview数据显示不全

    如果是内容是汉字,列的宽度设置不够时会自动换行,如果是数字和字母,是不会自动换行的,要把列宽设得足够,整个表格显示不全时,下面会有横向滚动条,如果看不见可能是高度超出了母控件的高度,设得低点就看见了

  5. [hadoop] map函数中使用FileSystem对象出现java.lang.NullPointerException的原因及解决办法

    问题描述: 在hadoop中处理多个文件,其中每个文件一个map. 我使用的方法为生成一个文件,文件中包含所有要压缩的文件在HDFS上的完整路径.每个map 任务获得一个路径名作为输入. 在eclip ...

  6. jwt-dotnet使用示例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 190411Python面向对象编程

    一.面向对象的概念 类:把一类事物的相同特征抽取出来整合到一起就是一个类,类是一个抽象的概念 对象:基于类创建的一个具体的事物 class People(object): '这是一个人类的类' def ...

  8. 0.jQuery选择器

    左边的是jQuery用法 右边是js用法 $("tag") == document.getElementsByTagName("tag"); $(". ...

  9. 使用TortoiseSVN新建及合并分支图文教程

    打开trunks目录,在trunks目录下新建两个文本文件A.java,B.java:   打开A.java输入以下内容: B.java文件可以随机输入些,本例中主要用于观察后续是否变化. 两个文件编 ...

  10. 2.1、Softmax Regression模型

    Softmax Regression模型 由于Logistics Regression算法复杂度低,容易实现等特点,在工业中的到广泛的使用,但是Logistics Regression算法主要用于处理 ...