Java并发编程实战 读书笔记

目录

1、介绍

2、线程安全

3、共享对象


1、介绍

  • 线程的优点
    • 恰当使用线程,可以提升复杂程序的性能,降低开发和维护成本
    • 可以把一部分复杂代码转为直接、简洁易懂的代码
    • 更有效地利用空闲处理器资源,提高吞吐量
    • 用户界面有更好的响应性
  • 线程的缺点 
    • 安全性(synchronized解决)
    • 活跃度:死锁、饥饿、活锁
    • 性能,上下文切换

2、线程安全

  • 编写线程安全的代码,本质上就是对状态(state)的的访问,而且通常是共享的、可变的状态
    • 线程不安全:如果多个线程访问了同一个变量,你的程序就存在线程不安全的可能性。在没有正确同步的情况下,就会有线程安全隐患。
      • 有3种方法修复它:
        • 不要跨线程共享变量
        • 使状态变量为不可变的
        • 在任何访问状态变量的时候使用同步
    • 一开始就将一个类设计成线程安全的,比后期修复他更容易
      • 使用封装、不可变性、明确的不变约束
  • 线程安全性
    • 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的
      • 简单来说:如果一个类在被多个线程访问时,可以持续进行正确的行为,它就是线程安全的
      • 无状态对象永远是线程安全的
  • 原子性:单独的、不可分割的
    • 竞争条件:检查再运行
    • 内部锁 synchronized
      • 一个synchronized块包含两部分
        • 锁对象的引用
        • 这个锁保护的代码块
      • synchronized方法的锁,就是该方法所在的对象本身(静态synchronized方法从class对象上获取锁)
      • 互斥(同一时间至多有一个线程访问)、可重入
  • 使用锁来保护状态
    • 操作共享状态的复合操作必须是原子的,复合操作要在完整的运行期间占有锁
    • 用锁来协调访问变量时,每次访问变量需要用同一把锁
  • 活跃度与性能
    • 缩小synchronized块的范围,可以提高性能,但决不能因此而舍弃安全性
    • 耗时的计算或操作,在操作期间不要占有锁

3、共享对象

  • 可见性
    • 重排序
      • 书中解释的不清楚,额外重点看一下
    • 多线程中共享的、可变的long和double是不安全的,即使不在意过期数据
      • Java允许将64位的操作拆分成两个32位,如果读和写发生在不同的线程,这个long变量又没有被volatile修饰,这种情况下读取这个long变量,那么就可能读到一个值的低32位和另外一个值的高32位
    • 锁和可见性
      • 内置锁可以个用来确保一个线程以某种可预见的方式看到另一个线程的影响。当线程A执行一个同步块时,线程B也随后进入了被同一个锁监视的同步块中,这时可以保证,在锁释放之前对A可见的变量的值,B获得锁之后同样是可见的。
      • 锁不仅仅是关于同步与互斥的,也是关于内存可见的。为了保证所有线程都能够看到共享的、可变变量的最新值,读取和写入线程必须使用公共的锁进行同步。
    • volatile
      • Java提供的一种同步的弱形式,确保对一个变量的更新以可预见的方式通知给其他线程
        • 当一个变量被volatile修饰的时候,编译器和运行时会监视这个变量,对这个变量的操作不会与其他内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方,所以想要读取一个volatile变量的值的时候,总是返回由某一线程读取的最新值
      • 访问volatile变量的操作并不会加锁,也不会引起执行线程的阻塞
      • 使用volatile变量来控制状态可见性的代码,比使用锁的代码更脆弱,更难理解
        • 正确使用的方式:用于确保他们所用的对象的状态的可见性、用于标识重要的生命周期事件的发生
      • 加锁可以保证原子性和可见性,volatile只保证可见性
      • 只有满足了下面所有的标准后,你才能使用 volatile 变量:
        • 写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值
        • 变量不需要与其他的状态变量共同参与不变约束;
        • 而且,访问变量时,没有其他的原因需要加锁。
  • 发布(publishing)和逸出(escape)
    • 发布(publishing)一个对象的意思是使它能够被当前范围之外的代码所使用
    • 一个对象在尚未准备好时就将它发布,这种情况称作逸出(escape)
  • 线程封闭:不共享数据就可以避免同步。线程封闭是实现线程安全最简单的方法之一
    • 栈限制:对象被限制在保存本地变量的执行线程中
    • threadLocal:一种维护线程限制的更加规范的方式
      • 它允许你将每个线程与持有数值的对象关联在一起。threadLocal提供了get与set 访问器,为每个使用它的线程维护一份单独的拷贝。所以 get总是返回由当前执行线程通过 set 设置的最新值。
      • ThreadLocal变量通常用于防止在基于可变的单体(Singleton)或全局变量的设计中,出现(不正确的)共享。比如说,一个单线程化的应用程序可能会维护一个全局的数据库连接,这个connection在启动时就已经被初始化了。这样就可以避免为每个方法都传递一个 connection。因为JDBC 规范并未要求 connection 自身一定是线程安全的,因此,如果没有额外的协调时,使用全局变量的多线程应用程序同样不是线程安
        全的。通过利用 ThreadLocal存储JDBC连接,每个线程都会拥有属于自己的 connection。
  • 不可变性
    • 创建后状态不能被修改的对象叫做不可变对象。不可变对象永远是线程安全的
    • 但是不可变性不等于把所有域都声明为final类型。final依然可变,只是引用不可变而已,内部的值依然是可以变的

4、组合对象

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助,以便快速解决问题。结合自身经验和网络资料,形成检查清单,期待大家提供更多技巧,共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络,如有侵权请联系删除。 一…

常见框架漏洞 中(IIS6.x、IIS7.x、Apache、Nginx)

目录 中间件 IIS IIS6.x篇 PUT漏洞 漏洞描述 环境 漏洞复现 漏洞复现 工具连接 IIS6.0解析漏洞 IIS短文件漏洞 漏洞描述 原理 复现 短⽂件名特征: ⼯具 IIS RCE-CVE-2017-7269 简介 影响范围 复现 利⽤⼯具 反弹shell Apache 未知扩展名解析…

Oracle【plsql编写九九乘法表】

九九乘法表 DECLAREi NUMBER : 1;j NUMBER : 1; BEGINFOR i IN 1 .. 9LOOPFOR j IN 1 .. iLOOPDBMS_OUTPUT.put (i || * || j || || i * j || );END LOOP;DBMS_OUTPUT.put_line ( );END LOOP; END;输出结果

Vue3从零开始——如何巧妙使用setup语法糖、computed函数和watch函数

文章目录 一、setup语法糖二、computed函数2.1 computed的基本用法2.2 computed vs methods2.3 注意事项 三、watch函数3.1 watch的基本用法3.2 immediate和deep选项 四、综合小Demo五、总结 一、setup语法糖 之前我们在编写代码时每次都要编写setup()​ ,默认导出配置&#x…

浮毛季到了,拒绝猫咪变成“蒲公英”,宠物空气净化器去除浮毛

同为铲屎官,面对家中无处不在的猫毛挑战,想必你也深感头疼。衣物、沙发乃至地毯上的明显猫毛尚可通过吸尘器或粘毛器轻松应对,但那些细微漂浮的毛发却成了难以捉摸的“小恶魔”,普通的空气净化器往往力不从心。对于浮毛&#xff0…

分享安装Windows11系统相关的经验

文章目录 1. 概述2. 安装过程3. 经验分享本章回中我们准备向大家介绍如何安装 Window11操作系统同时分享一些相关的安装经验。 1. 概述 有看官说都什么年代了还介绍如何安装操作系统,不过介绍安装操作系统的方法不是我的重点,我的重点是分享相关的安装经验,帮助大家少走弯…

熵权法模型(评价类问题)

目录 本文章内容参考: 一. 概念 二. 特点 三. 实现步骤 四. 代码实现 本文章内容参考: 熵权法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 利用信息熵计算各个指标的权重,从而为…

nvm 切换、安装 Node.js 版本

nvm下载路径 往下拉找到Assets 下载后,找到nvm-setup.exe双击,一直无脑下一步,即可安装成功。 配置环境变量(我的是window11) 打开任务栏设置–搜环境变量 配置好后,点确定一层一层关闭 windowR 打开控制…

Datawhale X 魔搭 AI夏令营 Task 01

Task 01 1. 注册阿里云 2. 跑通baseline 3. 生成图片并提交 后续思路: 调整prompt;更换微调数据集使用gpt生成故事简介

C++之类与对象(完结撒花篇)

目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中,我们对类的默认成员函数都有了一定了解,同时实现了一个日期类对所学的没内容进行扩展延伸,本…

JavaWeb04-MyBatis与Spring结合

目录 前言 一、MyBatis入门(MyBatis官网) 1.1 创建mybatis项目(使用spring项目整合式方法) 1.2 JDBC 1.3 数据库连接池 1.4 实用工具:Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理,不能实现动静分离对于大型网格,LVS的实施配置复杂,维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…

【C++高阶】:特殊类设计和四种类型转换

✨ 人生如梦,朝露夕花,宛若泡影 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂&am…

Java二十三种设计模式-策略模式(13/23)

策略模式:灵活算法的替换与扩展 引言 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 基础…

C#小结:如何在VS2022中使用菜单栏中的Git管理代码

目录 第一部分:基础操作 第一步,登录官网,设置好邮箱,然后右上角新建仓库 第二步,提交代码到远程仓库中 第三步,查看和比对自己修改的内容 第四步,查看该项目所有提交历史记录 第五步&…

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)

1、人脸识别 人脸识别是一种技术,通过检测、跟踪和识别人脸上的关键特征,以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法,提取人脸的特征点和特征描…

【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点

Pre-trained Language Models及其各种微调模型的实现细节和特点 1. Pre-trained Language Models2. semi-supervised Learning3. zero-shot4. Parameter-Efficient Fine-Tuning4.1 含义:4.2 实现方式: 5. LoRA5.1 LoRA 的主要特点:5.2 LoRA 的…

Pytorch人体姿态骨架生成图像

ControlNet是一个稳定扩散模型,可以复制构图和人体姿势。ControlNet解决了生成想要的确切姿势困难的问题。 Human Pose使用OpenPose检测关键点,如头部、肩膀、手的位置等。它适用于复制人类姿势,但不适用于其他细节,如服装、发型和…

Linux中apache服务安装与mysql安装

目录 一、apache安装 二、MySQL安装 一、apache安装 准备环境:一台虚拟机、三个安装包(apr-1.6.2.tar.gz、apr-util-1.6.0.tar.gz、httpd-2.4.29.tar.bz2) 安装过程: tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf http…

Burp Suite的使用和文件上传漏洞靶场试验

第一步:分析如何利用漏洞,通过对代码的查阅发现,代码的逻辑是先上传后删除,意味着,我可以利用webshell.php文件在上传到删除之间的间隙,执行webshell.php的代码,给上级目录创建一个shell.php木马…