要了解多线程,先需要把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. tornado设置cookie过期时间(expires time)

    具体的tornado设置过期时间的东西, 我也是查资料才发现的, 现在就贴代码吧 用户登录之后, 设置cookie, 我使用set_secure_cookie的, 它默认是有个30天的过期时间, 导致 ...

  2. C 可变参数的宏定义

    宏定义 也能来可变参数..吼吼..方便好多.. #define T(x,y...) printf(x,##y); C99标准..这我也管不到.... 关键是那个 ... 和 ## 我也不推荐到首页.记 ...

  3. 停止Nginx服务

    查询nginx进程信息 chen@ubuntu:~$ ps -ef |grep nginx root : ? :: nginx: master process /usr/sbin/nginx -g d ...

  4. 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

    Anagrams of string(带有重复项) 使用递归.对于给定字符串中的每个字母,为字母创建字谜.使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个数组中,最基 ...

  5. 倍增求lca(模板)

    定义LCA,最近公共祖先,是指一棵树上两个节点的深度最大的公共祖先.也可以理解为两个节点之间的路径上深度最小的点.我们这里用了倍增的方法求了LCA.我们的基本的思路就是,用dfs遍历求出所有点的深度. ...

  6. 上课总结-数据库Chapter2: 关系数据库

    Chapter2: 关系数据库 一.搞懂主键 外键关系 主键(主码):能唯一标识一个元组的某一属性组. 外键:不是这组数据的主键 但是另一组数据的唯一主键(当这组数据的主键有2个时 可以作为外键) 例 ...

  7. jmeter在linux上运行

    若需在linux操作系统上运行jmeter,则需要以命令行的形式运行. 前提条件:linux环境下配置好jdk.jmeter的环境变量等. 1.首先在Windows的图形化界面做好脚本,设置好并发用户 ...

  8. 【转】C#、面向对象、设计模式学习

    源地址:http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html

  9. 洛谷P2774 方格取数问题(最小割)

    传送门 考虑一下,答案就是全局和减去舍弃和 不难发现,如果我们按行数+列数的奇偶性分为两类,那么每一类中的数必然互不相邻 那么我们把原图的点分为黑点和白点两类,原地向白点连边,黑点向汇点连边,容量为点 ...

  10. 命令行里打 cd 简直是浪费生命

    简评:作为工程师,你在命令行下最常打的命令无非就是 cd 与 ls.这些年你浪费了多少时间? 作为一个程序员或者在 shell 中花费大量时间的人,你可能会经常以一种低效率的方式在目录中来回移动,特别 ...