要了解多线程,先需要把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. [转]xe6 android 使用距离传感器(Proximiry)

    The first step it's a run sample from RAD Studio that named SensorInfo on your device. On the tab Bi ...

  2. delphi 金额大小写转换函数

    {*------------------------------------------------ 金额大小写转换函数 @author 王云盼 @version V1506.01 在delphi7测 ...

  3. Qt信号与槽 如何写2个类,一个发送信号,一个接收并处理

    题目: 假设要做2个类,一个类的值提供一个函数SetValue,当这个值发生变化时,假设>10就触发告警调用B的函数; ------------------------------------- ...

  4. 删除当前文件夹的bat工具

    @echo off:11set /p path=Please enter delete filepath:del /f /s /q %path%rd /q /s %path%goto 11pause

  5. go channel缓冲区的大小

    go channel缓冲区的大小 len也可以作用于channel,代表现在channel缓冲区中还有多少数据没有读取.示例如下 c:=make(chan int,20) fmt.Println(&q ...

  6. 美团Java实习面试经历(拿到Offer)

      美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会.10月23日中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我 ...

  7. Mongoid Relationships

    1:1 embedded relationship: M:1 linked relationship(one_direction): child uses belongs_to parent uses ...

  8. I/O(输入/输出)---File类

    File:表示文件与目录.用它来对文件或目录进行基本操作,它可以查出文件的基本相关信息,比如:名称.最后的修改日期.文件大小. 使用File类操作文件和目录属性步骤: 1.引入File类 import ...

  9. MySQL5.7配置(第一次使用)

    MySQL5.7配置(第一次使用) 最近因为工作需要学习mysql的增删改查.用的公司的电脑,之前有人已经安装过mysql5.7,等于使用了免安装版,重新开始配置.参考了以下文章 http://blo ...

  10. 老男孩Day16作业:登录、注册、后台管理页面(动态)

    一.作业需求: 1.后台管理主界面(左边菜单框.(全选.反选)框.返回顶部按钮) 2.老男孩登录.注册页面 二.博客地址:https://www.cnblogs.com/catepython/p/93 ...