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;
		}
	}

	@Override
	public 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库组件来实现。

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

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

相关文章

python入门2

文章目录 前言一、集合与字典1、集合2、字典3、字典内置方法4、内置数据结构总结 二、控制流程1、结构流程概述2、分支结构3、循环结构 总结 前言 本文将介绍Python中的集合与字典以及控制流程。集合是一种无序且不重复的数据类型,它可以用于存储一组元素&#xff…

echarts多X轴, 多Y轴

需要的效果 原始数据 props.monitorData:{"lst_monitor_flow": ["152.68","207.64","103.82","21.21","33.81","40.71","273.80","208.66","104.33","15.80"…

如何在vs code中安装JavaFX

目录 下载JavaFX 配置vs code工程 编写测试代码 下载JavaFX 网站链接:https://openjfx.io 选择如下的版本

傲医医疗集成引擎 Rhapsody 在超融合信创平台表现如何?

作者:SmartX 商业团队 黄玉辉 随着越来越多的医疗用户基于超融合基础设施实现 IT 基础架构信创转型,超融合信创架构在医疗业务场景中的实际表现也得到更多关注。尤其是集成平台业务场景——作为三甲医院互联互通评级中不可缺少的核心业务系统&#xff0…

指针的认识(传值调用和传地址调用)

学习指针的目的是使用指针解决问题,那什么问题,非指针不可呢? 当要求写个函数来交换两个变量的值时,我们稍加思索,可以写成如下函数: void Swap1(int x, int y) {int tmp x;x y;y tmp; } 那么我们来进…

HBuilderX编写APP二、获取数据代码以及如何打包发行app

<template><!-- 修改APP名字的地方在pages.json文件里面 --><!-- <view class"content"><view class"">温度{{temp}} ℃ </view> //添加温度显示<view class"">湿度{{humi}} % </view> //添加湿度…

“OZON售后管理:加速处理流程,优化顾客售后体验“

在跨境电商领域欣欣向荣的发展浪潮中&#xff0c;退货及其它售后问题成为了许多卖家心头的一大困扰。为了解决卖家在处理退货售后时所面临的问题&#xff0c;无忧易售ERP上线了专为Ozon平台设计的退货规则&#xff0c;旨在帮助卖家们更好的优化售后服务、提升运营效率。 无忧易…

支付通道接口被脚本刷,如何解决

在数字交易日益频繁的今天&#xff0c;支付通道接口的安全性成为商家和平台不容忽视的问题。当支付接口被脚本恶意刷单时&#xff0c;不仅会导致财务损失&#xff0c;还可能引发合规风险和客户信任危机。本文将探讨支付接口被脚本刷单的原因、识别方法、应急处理方案&#xff0…

弘君资本:如何洞察先机?前瞻性指标揭秘新一轮船舶周期

多项目标共同提醒船只上行周期的到来。本文将以我国船只为例&#xff0c;综合剖析这一强周期职业的发展趋势。 复盘全球造船周期&#xff0c;可以看出均匀全球造船周期约为9.6年&#xff1b;在1886—2007年期间&#xff0c;有12个独立的周期&#xff0c;周期均匀长度约为9.6年…

YOLOv10环境搭建推理测试

引子 两个多月前YOLOv9发布&#xff08;感兴趣的童鞋可以移步YOLOv9环境搭建&推理测试_yolov9安装-CSDN博客&#xff09;&#xff0c;这才过去这么短的时间&#xff0c;YOLOv10就横空出世了。现在YOLO系列搞得就和追剧一样了。。。OK&#xff0c;那就让我们开始吧。 一、…

记一次 .NET某质量检测中心系统 崩溃分析

一&#xff1a;背景 1. 讲故事 这些天有点意思&#xff0c;遇到的几个程序故障都是和Windows操作系统或者第三方组件有关系&#xff0c;真的有点无语&#xff0c;今天就带给大家一例 IIS 相关的与大家分享&#xff0c;这是一家国企的.NET程序&#xff0c;出现了崩溃急需分析。…

年中企业业绩管理新篇章:用友BIP收入云助力高效管理!

随着市场竞争的加剧&#xff0c;年中时刻对于企业而言&#xff0c;不仅是评估上半年业绩的节点&#xff0c;更是调整策略、确保全年目标达成的关键时期。高效的业绩管理不仅需要明确的目标设定和计划制定&#xff0c;更需要借助先进的信息技术工具来提升管理效率和决策质量。在…

LES大涡模拟基础

参考自https://www.bilibili.com/video/BV1EL411A7gu?p30&vd_sourceb624b9d3e49866ce8c6a455f1ab7c03f 如何解析涡 用网格不能解析单元尺度以下的涡&#xff08;小涡&#xff09;而只能解析大涡 对于小涡&#xff0c;需要引入亚格子模型 如何选择合适的网格尺寸&…

智能充电模式,治好了我多年的充电焦虑

我是一个有严重电量焦虑的人&#xff0c;而且我发现我周围很多人都是。比如说&#xff0c;我晚上习惯把手机插上充电器&#xff0c;然后就放一边不管了&#xff0c;这样第二天出门才能100%满电&#xff1b;还有啊&#xff0c;有时候我在办公室一坐就是好几个小时&#xff0c;手…

一键式AI智能知识库-谈如何打造人性化的LLM RAG知识库的重要性

RAG系统简介 在现代的LLM RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统中&#xff0c;数据流的设计至关重要。让我们通过一个具体的例子来详细描述一个标准RAG系统的数据流。 首先&#xff0c;用户可以通过多种应用入口访问系统&#xff0c;包括PC应用、微…

实用新型专利申请材料的撰写与准备

在科技创新日益活跃的今天&#xff0c;实用新型专利的申请与保护显得尤为重要。实用新型专利作为一种重要的知识产权形式&#xff0c;对于推动科技进步、促进经济发展具有重要意义。 首先我们需要明确实用新型专利的定义。实用新型专利是指对产品的形状、构造或者其结合所提出…

用实力说话!深度解析蓝海创意云渲染“不排队”背后的秘密

蓝海创意云渲染农场https://www.vsochina.com/cn/render蓝海创意云渲染农场曾为《流浪地球2》、《长津湖》、《独行月球》、《斗破苍穹年番》、《巴霍巴利王2》等知名影视动漫作品提供云渲染服务。这些渲染案例充分证明了蓝海创意渲染深厚的技术底蕴和强大的渲染实力。那么&…

【权威出版/投稿优惠】2024年机器视觉与自动化技术国际会议(MVAT 2024)

2024 International Conference on Machine Vision and Automation Technology 2024年机器视觉与自动化技术国际会议 【会议信息】 会议简称&#xff1a;MVAT 2024截稿时间&#xff1a;(以官网为准&#xff09;大会地点&#xff1a;中国重庆会议官网&#xff1a;www.icmvat.co…

实现 ChatPDF RAG:密集向量检索(R)+上下文学习(AG)

实现 ChatPDF & RAG&#xff1a;密集向量检索&#xff08;R&#xff09;上下文学习&#xff08;AG&#xff09; RAG 是啥&#xff1f;怎么优化 RAG&#xff1f; RAG 是啥&#xff1f; RAG 是检索增强生成的缩写&#xff0c;是一种结合了信息检索技术与语言生成模型的人工智…

第1章 起步

第1章 起步 1.1搭建编程环境1.2 在不同操作系统中搭建 Python 编程环境1.3 运行Hello world 程序1.4 解决安装问题1.5 从终端运行 Python 程序 1.1搭建编程环境 1.1.1 Python 版本 本书编写期间的最新版本为 Python 3.7 1.1.2 运行 Python 代码片段 Python 自带一个在终端窗口…