首页 > 编程语言 >并发编程相关

并发编程相关

时间:2024-12-24 10:54:42浏览次数:9  
标签:缓存 字节 编程 并发 指令 线程 内存 相关 cpu

相关面试题:

 

计算机组成

 a=2+3  2,3从内存拿到cpu -> 计算->结果放到内存

 

操作系统管理线程的调度,os把app的线程指令扔到cpu

调度策略,最常见的cfs

 

线程数不一定越多越好,线程切换

 

 

CAS compare and swap

在JDK中的应用,原子类 do{}while(!cas)

 ABA问题解决

增加一个版本号,读取和版本号,修改版本号,比较版本号,也可以用boolean值来标记是否改过。

 

CAS底层实现

unsafe类中的本地方法,compareandswap

 

 

 java内存布局

对象头:markword 、 calss pointer 、    数组长度  

实例数据:

对齐填充

 可以用以下工具查看

 指针压缩

+UseCompressedClassPointer   头部指针压缩

+UseCompressedOops 普通指针压缩 比如对象属性里面的指针

Object o = new Obeject();占几个字节?

 

默认开启了指针压缩:

 

 markword - 8 klasspointer - 4  对齐填充 - 4  --------------------- 16字节

 

没有开启指针压缩:

 markword - 8 klasspointer - 8    --------------------------------------- 16字节

boolean byte   1

char short   2

int  float  4

long double 8

string  4普通指针压缩  未开启 8

 

synchronized

synchronize相关信息都记录在markword里面

偏向锁默认打开

锁升级过程

前面3种都属于无锁状态

偏向锁,同一个线程

轻量级锁/自旋锁,来了第二个线程,CAS操作

自旋次数过多(10)||线程超过cpu1/2  会消耗太多cpu  因此 会进行锁升级成为重量级锁

lockrecord里面记录的hashcode

重量级锁才是真的有锁mutex,向内核态申请,

重量级锁有个队列(无序,非公平锁),在队列里处于wait状态,不消耗CPU

偏向锁有时延,可以通过参数改成0,默认4s

1.6以后自适应

 

 锁降级只有在GC时才可以降级,除了GC线程没有其他线程访问,没有意义,可以认为锁降级不存在。

 

锁粗化,可以把锁加在whil外面

 

 

synchronized的最底层实现

也是 lock cmpxchg,volatile底层实现也是

 

 

缓存行

读数据从外往里读是按照块读,块——cache line/缓存行,一次性也就是一行数据 = 8字节

从内存往cpu读数据,一块一块读,一次读64位,因为总线宽64bits

缓存行大都数是64字节 bytes

 

 

cache line size = 8 字节   cache size = 64字节

cpu层级的数据一致性是以缓存行为单位的

缓存行对齐优化

 

 CPU 缓存一致性协议 MESI(intel使用,其他的cpu可能用别的协议)

 

volatile 

volatile解决了两个问题:

可见性,

顺序性(禁止指令重排序)

 

 指令重排序

 

指令重排的实验,正常情况 xy可能为01,10,11,但是不会出现00,乱序执行结果出现了00

 

如何阻止乱序执行?

jvm层面 

cpu层面

 

 

 

线程1执行了指令7   线程2执行第一次判断!=null直接返回版初始化的实例

 

指令重排序:单线程最终一致性就可以指令重排序。不考虑多线程情况。所以才需要加volatile。

 

OS通过加内存屏障

java通过加关键字volatile,JVM看到指令后加屏障(4种,规范),c++通过lock实现,只允许一条指令穿过总线

 

 

 jvm四种引用

强:内存不够也不回收 OOM

软若虚实际上有两个引用      SoftReference<byte>  b = new SoftReference<new byte[1024*1024*10 ]>  b--new Soft...是强引用   new Soft...--new byte....才是软引用,其他两个同理

软:缓存  eg.图片,内存不够的时候回收掉

*弱:发生垃圾回收时直接回收。一次性。 Threadlocal,在spring事务有用到

threadlcoal用完后,key为null,value需要remove,否则还是会内存泄漏

 

 

 

虚:虚引用get不到,跟没有一样,用处:管理对外内存。NIO 零拷贝,直接操作os缓冲区数据。GC垃圾回收不会回收对外内存,垃圾线程监听对jvm里面的内存,被回收了就加紧queue,queue里面对应的堆外内存就会做相应处理。

 

 

 

 

 

 JVM禁止指令重排序的情况

happens-before规则

 

volatile实现

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

哈哈哈哈

 

标签:缓存,字节,编程,并发,指令,线程,内存,相关,cpu
From: https://www.cnblogs.com/jyzyz/p/18211268

相关文章

  • PLC编程—基本知识
    PLC编程—基本知识 1.OB、FB、FC功能OB(组织块):用于执行特定的任务(CPU启动、循环扫描、时间中断、硬件中断等),每个OB块均有一个特定的功能和优先级(特定事件发生时被触发)。FB(功能块):具有内部存储器,可保留状态数据,适用于多频次调用需要保持数据状态的场合(PID控制器、计数器等)。FC(功......
  • ArkUI 的声明式 UI 编程与状态管理:构建高效鸿蒙应用
    ArkUI的声明式UI编程与状态管理:构建高效鸿蒙应用在鸿蒙应用开发领域,ArkUI脱颖而出,其独特的声明式UI编程与高效的状态管理机制,为开发者开辟了一条便捷、高效的开发之路,重塑了移动应用的构建方式。声明式UI编程,摒弃传统命令式繁琐操作,宛如一位精细的画师,用简洁笔触勾勒界......
  • 每天学习编程两小时(第1天)-图论算法
    学习目标:掌握图论的基本算法(求解每个节点的单源/多源最短路径,求解最小生成树)学习内容:例如:prim算法求解最小生成树Dijkstra算法求解单源最短路径学习时间:2024年12月23日下午学习产出:掌握最小生成树和最短路径的定义和区别掌握prim算法和Dijkstra算法的思想实现......
  • Linux初学者的全面指南(四):shell编程(下)
    目录一、表达式与运算符1.表达式2.运算符  二、流程控制语句1.多命令组合 2.分支结构三、函数 1.定义与调用2.参数3.定义与调用4.返回值 总结一、表达式与运算符1.表达式算术表达式bash自身并不支持简单的数学运算,但可通过awk和expr等命令来实现数学......
  • C++ 面向对象编程:+号运算符重载,左移运算符重载
    像+、-号进行运算符重载,过程类似,见以下代码示例:#include<iostream>#include<string>usingnamespacestd;classnumber1{   friendnumber1operator+(number1&one,number1&two);public:   number1():msg1(0),msg2(1){}   number1(intmsg1,intmsg......
  • 【python编程】Python的site钩子机制
    Site简介我们知道:Pythonimport时会首先寻找sys.path中列出的路径,类似下面:sys.path['','/usr/local/lib/python36.zip','/usr/local/lib/python3.6','/usr/local/lib/python3.6/lib-dynload','/usr/local/lib/python3.6/site-packages&#......
  • php网络编程tcp
    服务端:<?php$server=newSwoole\Server('127.0.0.1',9501);$server->set(['worker_num'=>8,//worker进程数cpu1-4倍'max_request'=>10000,//根据内存定义https://wiki.swoole.com/#/server/setting//'......
  • php网络编程swoole http
    服务端:<?phpuseSwoole\Http\Server;useSwoole\Http\Request;useSwoole\Http\Response;//创建HTTP服务器$server=newServer('127.0.0.1',9501);$server->on('start',function($server){//print_r($server);echo&qu......
  • php网络编程swoole websocket
    服务端:<?phpuseSwoole\WebSocket\Server;//创建HTTP服务器$server=newServer('127.0.0.1',8888,SWOOLE_PROCESS,SWOOLE_SOCK_TCP);$server->on('start',function($server){//print_r($server);echo"Swoolewebsock......
  • php网络编程swoole udp
    服务端:<?php$server=newSwoole\Server('127.0.0.1',9504,SWOOLE_PROCESS,SWOOLE_SOCK_UDP);$server->on('start',function($server){echo"UDPServerisstartedatudp://127.0.0.1:9504\n";});$server->......