要了解多线程,先需要把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. vs2017 C++动态链接库的创建和调用(隐式)

    一.VS创建动态链接库 1.打开vs新建项目 创建动态链接库 2.添加头文件.h,在h文件中添加如下内容: #pragma once//该头文件只编译一次#include<iostream> ...

  2. 以太坊系列之五: p2p的nat模块--以太坊源码学习

    p2p的nat模块 该模块相对比较简单,因为nat的真正实现并不在此模块,主要是使用了第三方的nat-upnp和nat-pmp来实现真正的穿透(端口映射). 对外公布的接口 ```go // An i ...

  3. 十四、JS同步异步知识点,重点(Node.js-fs模块补充篇)

    (本片文章如果你能耐着性子看我,保证会对同步和异步有一个非常深刻的理解) JavaScript是单线程执行,所谓的单线程呢就是指如果有多个任务就必须去排队,前面任务执行完成后,后面任务再执行.因为Ja ...

  4. spring boot 第一个Dome

    1.创建Maven项目 按照下面的步骤 项目创建完成后的目录结构 2. 参照Spring boot官方文档修改pom.xml 修改 maven编译的jdk版本 将spring boot设置为 pare ...

  5. 1. UML统一建模语言

    (1)UML概述: 建模: 对现实系统进行适当的过滤, 用适当的表现规则描述出简洁的模型. 建模是一种深入解决问题的方法. UML: UML(United Modeling Language, 统一建 ...

  6. 简单的IDEA破解到2099年

    原文链接:https://www.cnblogs.com/duende99/p/10038640.html 破解方式有2种,第一种比较方便 第一种比较方便1.使用注册码破解:http://idea.l ...

  7. centos安装mysql57

    下载源安装文件 https://dev.mysql.com/downloads/repo/yum/ wget http://repo.mysql.com//mysql57-community-rele ...

  8. 190225Redis

    一.Redis的简单使用 Redis操作模式 # Author:Li Dongfei import redis r = redis.Redis(host='192.168.56.7', port=63 ...

  9. Qt 学习之路 2(45):模型

    Home / Qt 学习之路 2 / Qt 学习之路 2(45):模型 Qt 学习之路 2(45):模型  豆子  2013年2月26日  Qt 学习之路 2  23条评论 在前面两章的基础之上,我们 ...

  10. anaconda 换源

    2019.4.24更新: 清华源停止维护了(见:https://mirrors.tuna.tsinghua.edu.cn/news/close-anaconda-service/).以下方法不再适用. ...