java多线程初探

文章目录

  • countDownLatch
  • volatile
  • CAS
  • jdk1.6对synchronized的优化
    • 自旋锁
    • 锁消除
    • 锁粗化
    • 轻量级锁
    • 偏向锁
  • java AtomicBoolean compareAndSet Demo
  • threadlocal
  • concurrent queue
  • 原子操作是否需要同步
  • copyonwrite容器
  • 可重入锁
  • 公平与非公平
  • 并发编程步骤

countDownLatch

此类位于java.util.concurrent.countDownLatch。latch是门闩的意思。
有位博主打了个比方,在此引用:“三二一,芝麻开门”。
跟信号量的思想相似,不过countDownLatch更加简单。只有两个方法,一个是countDown,一个是await。countDown方法的效果就是倒数,await的作用是等待倒数至0。
一个背景是,即使各线程的工作量划分非常合理,它们也总会先后完成。
配合使用的效果是,确保数个协作的并发线程都完成后,才继续向下执行。

volatile

volatile的本意是易变的。一个背景是,易变的东西是不适合缓存的。
在C中,volatile的作用是,确保读写都访问变量地址(而不是缓存)。
在Java中也是同样的意思。
同步会让主存刷新。所以如果一个变量完全由 synchronized 的方法或代码
段 (或者 java.util.concurrent.atomic 库里类型之一) 所保护,则不需要让变量用volatile。
volatile关键字可以阻止重排 volatile变量周围的读写指令。这种重排规则称为 happens before 担保原则。这项原则保证在 volatile 变量读写之前发生的指令先于它们的读写之前发生。同样,任何跟随 volatile 变量之后读写的操作都保证发生在它们的读写之后。
bruce建议不要用这个关键字,用atomic系列来替代。

CAS

全称是compare and swap。已经得到汇编指令支持。
回想一下那道经典题,两个线程各执行100次自增,有哪些可能的结果。
1.线程a和b一开始都读到0,存在线程内存中;
2.线程a执行99次,将99写入主存;
3.线程b执行1次,将1写入主存;
4.线程a读到1;
5.线程b执行99次,将99写入主存;
6.线程a执行1次,将2写入主存。
其实,线程b在第三步的时候如果compare一下就会发现问题了。线程b在第一步读是0,在第三步读到的是99,这说明线程b在“读取-计算-准备写入”期间,有其它线程也在工作。
compare and swap就在于此,在写入之前,compare一下读到的值(99)和预期值(0),如果不同,就不写入,而是用读到的值重新计算。也就是重新进行“读取-计算-准备写入”的过程。
在这里插入图片描述
乐观,就是假设冲突较少,或者说“相信”多线程不会出问题。悲观,就是假设冲突较多。
因此,乐观锁适合并发量小,冲突确实比较少的场景;悲观锁则反之。

CAS和synchronized相比,好处在于,避免了线程状态的切换。
java中,Atomic开头的包装类,如AtomicInteger,底层实现就是CAS。相比synchronized,更加轻量。

jdk1.6对synchronized的优化

自旋锁

上文已经介绍。

锁消除

消除不可能存在数据竞争的锁

锁粗化

粗化的好处是不用加锁多次。

轻量级锁

无竞争条件时,通过CAS消除同步互斥

偏向锁

无竞争条件时,消除同步互斥,也不进行CAS操作。

java AtomicBoolean compareAndSet Demo

实现了一个计时器。

public class TimeController implements Runnable {private waitSeconds;public static AtomicBoolean isStop = new AtomicBoolean(false);//初始值public TimeController(long waitSeconds) {if(waitSeconds == 0) {waitSeconds = Long.MAX_VALUE;}}@Overridepublic void run() {while(waitSeconds > 0) {if(isStop.get() == true) {//提示信息break;}try {Thread.sleep(1000);} catch (InterruptedException e) {//提示信息}waitSeconds--;}isStop.compareAndSet(false, true);//第一个参数是expect,第二个参数是update}
}

threadlocal

相当于线程的私有存储空间,有get和set方法。
在这里插入图片描述

concurrent queue

据说java concurrent queue的size方法是O(n)的。还可深究。

原子操作是否需要同步

能通过Goetz测试的专家可以尝试用原子操作来代替同步。否则不要尝试。

可见性问题比原子性问题多得多。

原子操作并不解决可见性的问题。相反,同步机制强制多核处理器系统上的一个任务做出的修改必须在应用程序中是可见的。

对属性赋值,返回,通常是原子性的。
在Java中,自增不是原子性的。

copyonwrite容器

比如,CopyOnWriteArrayList。
多线程环境下保证线程安全(以免修改到一半被读取。只有在完成修改之后才可见), 并通过读写分离提高性能。
CopyOnWriteArraySet 使用 CopyOnWriteArrayList 来实现其无锁行为。
ConcurrentHashMap 和 ConcurrentLinkedQueue 使用类似的技术来允许并发读写,但是只复制和修改集合的一部分,而不是整个集合。

可重入锁

意思是,在一个线程中可以多次获取同一把锁。
比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁。

公平与非公平

公平,先来的先获得锁。
非公平,谁抢到算谁的。
非公平的效率较高。synchronized是非公平的。
这两种情况一般一种是默认,另一种可以通过参数设置。

并发编程步骤

1.尽量别用。
2.尽量用stream.parallel和completableFutures。
3.不要共享变量,任务间的信息传递应该通过concurrent库中的并发数据结构。
4.共享变量时用atomic类,或者将所有对共享变量的访问加synchronized。
5.volatile和synchronized一般都可以避免,尽量用concurrent库组件来实现。

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

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

相关文章

bootstrapblazor小白笔记

使用了bootstrapblazor,采用.net8.0,server模式,所有的问题都是基于以上条件所遇到的 1、登录过后需要在每个页面都使用认证吗 是不需要的,每个页面都写attribute [Authorize]没有问题,但是页面很多的话一个一个的写很…

QT 音乐播放器【一】 显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了,就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针,用于监控音频流。当音频流被捕获或播放时,QAudioProbe 可以接收到音频数据。这个类在需要访问…

1371. 每个元音包含偶数次的最长子字符串

1371. 每个元音包含偶数次的最长子字符串 原题链接:完成情况:解题思路:参考代码:_1371每个元音包含偶数次的最长子字符串 错误经验吸取 原题链接: 1371. 每个元音包含偶数次的最长子字符串 https://leetcode.cn/pro…

项目管理工具Maven基础

文章目录 1 Maven概述2 Maven项目基础2.1 项目坐标2.2 项目结构2.3 pom配置文件 3 Maven依赖管理3.1 依赖配置3.2 依赖范围3.3 依赖传递和排除 4 Maven生命周期5 参考资料 1 Maven概述 Maven是Apache旗下的一个开源项目,是一款用于管理和构建java项目的工具&#x…

404错误页面源码,简单实用的html错误页面模板

源码描述 小编精心准备一款404错误页面源码,简单实用的html错误页面模板,简单大气的页面布局,可以使用到不同的网站中,相信大家一定会喜欢的 效果预览 源码下载 https://www.qqmu.com/3375.html

蓝桥杯嵌入式国赛笔记(3):其他拓展板程序设计(温、湿度传感器、光敏电阻等)

目录 1、DS18B20读取 2、DHT11 2.1 宏定义 2.2 延时 2.3 设置引脚输出 2.4 设置引脚输入 2.5 复位 2.6 检测函数 2.7 读取DHT11一个位 2.7.1 数据位为0的电平信号显示 2.7.2 数据位为1的电平信号显示 2.8 读取DHT11一个字节 2.9 DHT11初始化 2.10 读取D…

配置本地 apt 源

挂载iso镜像文件 注意:文章中的挂载方法是临时挂载,重启服务器失效 我是使用iBMC的虚拟控制台将我的iso文件以设备的形式挂载到服务器上,我的iso文件是设备:/dev/sr0 也可以直接将iso文件上传到服务器某个目录。 将 /dev/sr0 进…

【竞技宝】欧洲杯:德国被乌克兰逼平,27脚射门仍难得分!

欧洲杯前的热身赛已经全面开启,东道主德国队算是打响了热身赛的第一枪,只可惜他们在主场0比0被乌克兰逼平。整场比赛,德国队都占据明显优势,全场比赛轰出27脚射门,可是却无法实现破门。这个时候德国球迷似乎回想到了前两届世界大赛,球队被“锋无力”支配的恐惧。 本场比赛德国队…

拓扑排序详解

目录 一、拓扑排序前置知识 1.1 定义: 1.2 AOV网: 二、如何拓扑排序 2.1 运用 kahn 算法: 2.2 实现拓扑排序: 2.3 拓扑排序的应用: 2.4 拓扑排序编写模板: 三、例题练习 3.1 例题1:课…

虚拟机安装 RockyLinux为例

目录 一、VMWare、Xshell、Xftp、LinuxISO资料下载 二、VMWare安装 三、创建虚拟机 四、虚拟机安装过程的问题 一、VMWare、Xshell、Xftp、LinuxISO资料下载 链接:百度网盘 请输入提取码 提取码:6666 二、VMWare安装 三、创建虚拟机 四、虚拟机安装…

工具类产品一定适合走简洁路线,不接受反驳。

工具类产品通常适合走简洁路线。这是因为工具类产品的主要目标是解决用户的问题或提供某种功能,因此用户更关注产品的实用性和易用性,而不是过多的装饰和复杂的功能。 以下是为什么工具类产品适合走简洁路线的一些原因: 用户体验&#xff1…

【iOS】didReceiveMemoryWarning实例方法

iPhone下每个App可用的内存是被限制的,如果一个App使用的内存超过20M,则系统会向该App发送Memory Warning(内存警告)消息,收到此消息后,App必须正确处理,否则可能出错或出现内存泄漏。 目录 流程…

回归现实:无需复杂假设即可轻松评估过程能力的简单方法

Cpk 和 Ppk 等过程能力指标能够测量您的过程相对于客户规格要求的执行情况。我们先回顾一些能力分析基础知识,再深入了解另一个能力估计值 Cnpk,该估计值很可能在您的能力分析库中非常有用。 能力统计指标分析 能力统计指标使用单个数字,是一…

Linux命令 netstat -anp | grep 的用法

文章目录 1、第一种解释2、第二种解释3、第三种解释4、第四种解释5、第五种解释6、netstat --help 在Windows中,杀死端口占用的博客链接 1、第一种解释 在Unix和Linux系统中,netstat -anp 命令用于显示所有的网络连接( -a 表示所有&#xff…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

浏览器阻止屏幕息屏,js阻止浏览器息屏,Web网页阻止息屏

场景: 比如打开一个浏览器页面(比如大屏),想让它一直显示着,而不是过几分钟不操作就屏幕黑了.(电脑有设置电脑不操作就会多长时间就会息屏睡眠,如果要求每个客户都去操作一下电脑设置一下从不睡眠,这很不友好和现实.而且我也只想客户在大屏的时候才这样,其他页面就正常,按电脑设…

如何从 Android 中恢复误删除的照片

尝试恢复 Android 智能手机上误删的文件、照片和视频可能非常麻烦,但无论如何,这是可以做到的。根据您用于删除照片的应用程序,方法可能因设备而异。但是,如果删除时间不长,您可能能够恢复它。在本文中,我们…

使用element的小弹框并修改css

使用el-popover来做弹框&#xff1a; 滑动或点击元素要加插槽slot"reference"来展示弹框&#xff1b; <el-popoverplacement"top"width"166"trigger"hover"popper-class"popover"><div><div><div>…

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要&#xff0c;要在服务器上使用Jenkins完成Android项目的自动化构建&#xff0c;但服务器上登录的账户没有管理员权限&#xff0c;无法用sudo命令&#xff0c;因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

防爆气象站解析

TH-FBCQX2&#xff08;FB02&#xff09;随着工业领域的快速发展&#xff0c;安全生产问题日益受到重视。特别是在石油化工、煤矿、烟花爆竹等易燃易爆环境中&#xff0c;准确、及时地获取气象数据对于预防事故、保障人员安全具有重要意义。防爆气象站作为这些特殊环境中不可或缺…