Java并发--内存结构图及线程安全

内存结构图

内存-> (开辟的数组) -> (方法区,堆,栈,程序计数器,本地方法栈)

img

:几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。

方法区它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference),方法的拷贝运行。只有处于栈顶的方法才处于运行状态,其他的属于就绪状态。

本地方法栈:栈中方法拷贝运行时,因为底层时c语言的方法,所以需要本地方法栈,来翻译方法,使之成为操作系统本身的内核方法,对接驱动。

每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址

小例子:

w,e的指向确实改变了,但是没有影响到x1,x2。

什么是Class常量池?

  • 我们写的每一个Java类被编译后,就会形成一份Class文件Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用

  • 每一个Class文件中都有一个Class常量池

被编译后的类就会进入Class常量池

IO操作

IO操作,就是将数据写入内存或从内存输出的过程,也指应用程序和外部设备之间的数据传递。

常见IO流操作,一般指内存与磁盘间的输入输出流操作。

final关键字

1.对象构造函数内有final域,必须先用构造函数构造对象,再把对象赋给其他引用 2.如果对象有final域,必须先读对象的引用,再读final域。

这两个规则的目的是保证:在对象引用为任意线程可见之前,对象的final域已经被正确初始化过了,而普通域就不具有这个保障。

请看下面的Java代码,它定义了一个类Person,有两个域:name和age。name是一个final域,age是一个非final域。然后,它创建了一个Person对象,并在另一个线程中读取它的域。

c
lass Person {
    final String name; // final域
    int age; // 非final域
public Person(String name, int age) {
    this.name = name; // 写final域
    this.age = age; // 写非final域
}
}
​
public class Test {
    static Person person;
    public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            person = new Person("Alice", 20); // 把对象引用赋值给person
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            if (person != null) { // 读对象引用
                System.out.println(person.name); // 读final域
                System.out.println(person.age); // 读非final域
            }
        }
    });
    t1.start();
    t2.start();
    t1.join();
    t2.join();
}
}

根据final的重排序规则,线程t2在读取person.name时,一定能看到正确的值Alice,因为写final域和赋值对象引用之间不能重排序。但是,线程t2在读取person.age时,可能看到的不是正确的值20,而是0,因为写非final域和赋值对象引用之间可以重排序。这就是final和非final域的区别

使用多线程可能会带来的问题

并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、死锁、线程不安全等等。

如何理解线程安全不安全?

线程安全和不安全是在多线程环境下对于同一份数据的访问是否能够保证其正确性和一致性的描述。

  • 线程安全指的是在多线程环境下,对于同一份数据,不管有多少个线程同时访问,都能保证这份数据的正确性和一致性。

  • 线程不安全则表示在多线程环境下,对于同一份数据,多个线程同时访问时可能会导致数据混乱、错误或者丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现iOS App代码混淆

简介 在开发iOS应用程序时,保护代码安全是至关重要的。代码混淆是一种常用的技术,可以增加逆向工程的难度,防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

Python输入与输出

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专…

浏览器渲染原理-解释回流重绘以及为什么transform效率高

浏览器是如何渲染页面 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启染流程。 整个渲染流程分为多个阶段&#xf…

HW面试经验分享 | 某服蓝队初级

前言 依稀记得是22年 7、8月份参加的HW,当时是比较炎热的时候,但又夹杂一丝秋意。也是头一次去离家乡比较远的地方,多少有点忐忑……(怕被噶腰子、水土不服、吃穿用住没着落等等),但最终也是平安无事且顺利…

笔记84:关于递归法的一些感悟

题目1:二叉树的前序遍历 链接:. - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…

独立服务器如何安装Webmin面板

本周有一个客户,购买Hostease的独立服务器,询问我们的在线客服,独立服务器支持安装Webmin及如何安装的问题。我们为用户提供教程,用户很快完成了设置。在此,我们分享这个操作教程,希望可以对您有帮助。 Web…

SkyWalking 为所有的API接口增加 tag

背景胡扯 线上接口报错,接着被 SkyWalking 抓到,然后 SkyWalking 触发告警,最后老板你,让你辛苦一下,在明早上班前把这个bug 改了,并告诉你你是全公司的希望。谁说不是呢?为公司业务保驾护航&a…

成都欣丰洪泰文化传媒有限公司领航电商新纪元

在当今数字化飞速发展的时代,电商行业异军突起,成为推动经济增长的重要力量。在这股浪潮中,成都欣丰洪泰文化传媒有限公司以其专业的电商服务脱颖而出,成为业界的佼佼者。本文将带您一探这家公司的独特魅力和专业服务,…

D365开发-在视图按钮的js里,引用别的js里的公共方法

公共方法写法: "use strict"; var JJMC window.JJMC || {}; JJMC.SamMCommon JJMC.SamMCommon || {}; (function () { this.cloneRecord function (excludeAttrbuteNames){ / } }).call(JJMC.SamMCommon); 然后在需要调方法的command里面,之…

手机适配,在真机上适配正常,在pc端适配出现横向滚动条

问题背景 最近,在做一个项目适配的时候,出现一个很奇怪的问题,在真机上,适配一切正常,但是在pc端,适配,偶现横向滚动条。 而且发现一个离奇的事情,就是适配出现横向滚动条&#xff…

UE5 GAS开发P32,33 初始化状态并绑定在HUD上,拾取物品增加血量和减少蓝量

这节课主要是修改WidgetController和OverlayController,在EffectActor内新增了一个减少蓝量的代码,同时修复了一个bug,并且展示了为什么要写成单独的控制器,因为要考虑多人游戏的情况,每一个控制器都是一个单独的角色 首先修改AuraAttirbuteSet.cpp UAuraAttributeSet::UAura…

泰山众筹:低门槛高回报的电商营销新模式

大家好,我是吴军,来自一家专注于软件开发的公司,担任产品经理一职。今天,我想与大家分享一种备受瞩目的商业模式——泰山众筹。 泰山众筹之所以能够在市场上迅速走红,其背后的原因值得我们深入探讨: 首先&…

ATFX港股:长周期看,恒生指数报价已经回到2008年以来的底部区域

消息面: 1、 4月12日,官方发布《推动资本市场高质量发展的若干意见》文件,其中提到九条意见,被称为“国九条”,重要内容有:将上市前突击“清仓式”分红等情形纳入发行上市负面清单;推动一年多次…

Vue3学习05 一些API

Vue3-API 其它 API【shallowRef 与 shallowReactive 】shallowRefshallowReactive总结 【readonly 与 shallowReadonly】readonlyshallowReadonly 【toRaw 与 markRaw】toRawmarkRaw 【customRef】 Vue3新组件【Teleport】【Suspense】【全局API转移到应用对象】【其他】 其它 …

罗芬COHERENT pmb激光电源维修HPC830

Rofin激光电源 PMB高压电源维修:HPC625,HPC520,HPC210,HPC840,HPC830,HPC810,HPC818,HPC818 HPC814 HPC910等型号。 大型设备往往都配有功能较为故障诊断程序,我们可以充分利用软件的提示,缩小故障排查范围,但有时诊断软件提示的受损元件是否…

导入数据库文件到宝塔提示导入成功但是没有任何表信息

本地数据库上传到宝塔,提示导入成功但是没有数据库的任何数据表信息,这个很可能是与你本地mysql服务器和你宝塔上的mysql版本不一致导致的,我的本地的数据库是8.0的,但是宝塔上面是5.7的,所以肯定就导入不进去。 解决…

c语言-预处理详解【求个关注!】

预处理详解 一 预处理阶段1 知识背景:2 预定义符号3 #define 定义常量当定义的标识符的值过长时:注意,如果#define定义的标识符,其值的末尾有; 则说明; 是该标识符值的一部分 4 #define 定义宏宏的声明方式:当传入的参…

【系统分析师】数据库部分

文章目录 1、数据库模式2、数据库设计过程2.1ER模型 3、关系代数 ☆5、规范化理论☆5.1 非规范存在的问题5.2 相关概念5.3范式5.3.1 第一范式-1NF5.3.2 第二范式-2NF5.2.3 第三范式5.2.4 BC范式 5.4 函数依赖分解5.4.1保持函数依赖分解5.4.2 无损分解 5.5 Armstong公理系统 6、…

FANUC机器人单轴零点标定的具体方法(全轴零点标定不方便时可采用)

FANUC机器人单轴零点标定的具体方法(全轴零点标定不方便时可采用) 前面和大家分享了FANUC机器人进行零点标定的原因和方法,具体可参考以下链接中的内容:: FANUC机器人进行零点标定的目的和具体方法步骤详解

从零开始学习Linux(1)---基本命令(1)

1.学习准备 我学习Linux是使用xshell远程登录自己的云服务器来进行。 xshell是一个远程终端管理软件,下载官网: https://www.netsarang.com/products/xsh_overview.htm 下载安装的时候选择 "home/school"…