JAVA并发编程(二)内置锁和对象共享

X3850x6 6241 fireware固件升级 登录联想https://datacentersupport.lenovo.com/cn/zc网站,选择system x,x3850 x6,type选择6241 选择驱动及应用程序,BIOS/UEFI 选择lnvgy_fw_uefi_a9e156a-4.90_anyos_32-64.uxz 文件,点击下载 选择IMM2, 下载lnvgy_fw_imm2_tcoo58b-5.80_anyos_noarch.uxz ps:3837和3839会跳转到ibm网站下载 笔记本直连. 阅读详情

《JAVA并发编程实战》读书笔记

多线程的优势

1、充分发挥多处理器能力
2、建模的简单性
3、异步事件的简化处理
4、响应更灵敏的用户界面

多线程的风险

1、线程安全性问题
2、活跃性问题
3、性能问题

线程的安全性

当多个线程访问同一个可变状态变量时,如果没有合适的同步处理程序会出现错误。解决方法通常有三个
1、不在线程之间共享变量
2、将共享变量修改为不可变的变量
3、在访问变量时使用同步
无状态的对象一定是线程安全的。要保持状态的一致性,就要在单个原子操作中更新所有相关的变量状态。

内置锁

Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。内置锁的最小颗粒度是对象,修饰方法上的锁也是作用于对象。有时候叫它方法锁,但是实际上是锁住的对象。
内置锁又被称为监视锁,线程在进入同步代码块之前会自动获得锁,推出时才释放锁,获得内置锁的唯一路径就是进入这个锁保护的同步代码块或者同步方法。
最多只有一个线程可持有这种锁,所以它是线程安全的。当某个线程请求一个其他线程持有的锁时,发出请求的线程就会阻塞。但是如果某个线程视图获得一个已经由自己持有的锁,这是可以得。也就是说锁可以重入。重入意味着获取锁的操作粒度是“线程”而不是“调用”。
重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数为0时,这个锁没有任何持有者。当线程请求一个没有被持有的锁时,JVM记录下锁的持有者,计数值加1,如果同一个线程再次获取这个锁,计数值递增,而线程退出同步代码块时,计数器相应递减。当计数为0时,这个锁被释放。
如果一个变量会被多个线程访问、修改,那么就需要对这个变量进行锁保护。

活跃性和性能

同步方法每次只允许一个线程执行,这样同步方法的效率反而降低了。大量的请求排队处理就会导致不良并发。解决方法是尽可能缩小同步代码作用范围,当然,只能说是优化。要判断同步代码块的合理大小,需要在各种设计需求之间进行权衡。包括安全性、简单性和性能。
当执行时间较长的计算或者可能无法快速完成的操作时,一定不要持有锁。

对象的共享

在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。
当一个线程读取一个值,可能读取到的是失效数据。失效值能保证最低安全性。这个值可能是之前的值,而不是一个随机值。但是对非原子的64位操作会有更严重的问题,JVM允许将64位操作分解为两个32位操作,可能会读取到某个值得高32位和另一个值得低32位。
为了保证所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。
JAVA提供了稍微弱一些的同步机制,volatile变量。它能确保变量的更新操作能通知到其他线程。volatile变量上的操作不会与其他操作一起重排序,volatile变量不会被缓存在寄存器或者其他处理器不可见的地方,读取volatile变量总会返回最新值。
加锁机制既可以确保可见性,又可以确保原子性。而volatile变量只能确保可见性。
当且仅当满足以下条件时,才能使用volatile变量:
1、对变量的写入操作不依赖当前值,或者确保只有一个线程更新变量值。
2、该变量不会与其他变量一起纳入不变性条件中。
3、在访问变量时不需要加锁。
如果仅在单个线程内访问数据,就不需要同步。这种技术被称为线程封闭。volatile变量是一种特殊的线程封闭,相当于将修改操作封闭在一个线程中,并且volatile变量的可见性确保了其他线程看到的是最新值。
ThreadLocal类可以很好的实现线程封闭。

不可变对象一定是线程安全的。
除非某个域需要改变,否则应将其声明为final域。


欢迎扫描二维码,关注公众号
ROS2 Humble + TurtleBot4仿真环境搭建与避坑实战 本文详细介绍了ROS2 Humble与TurtleBot4仿真环境的搭建与避坑实战,包括环境配置、依赖安装、仿真调试和性能优化等关键步骤。通过保姆级教程和实用技巧,帮助开发者快速搭建稳定的机器人仿真环境,提升开发效率。特别推荐使用Ubuntu 22.04原生系统以避免常见问题。 阅读详情

相关推荐

如何下载最新版本的VMware Workstation

随着虚拟化技术的发展,VMware Workstation作为行业领先的桌面虚拟化软件,为用户提供了在单一物理计算机上运行多个操作系统的能力。本文将详细介绍如何从Broadcom支持网站下载最新的VMware Workstation Pro版本。

安呀智数据坊的博客 665

java 中的锁 aqs_深入介绍Java中的锁(原理、锁优化、CAS、AQS)

1、为什么要用锁?锁-是为了解决并发操作引起的脏读、数据不一致的问题。2、锁实现的基本原理2.1、volatileJava编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。volatile在多处理器开发中保证了共享变量的“ 可见性”。可见性的意思是当一个线程修改一个共享变量时...

weixin_34621309的博客 294

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 920

内置锁(Synchronized)

什么是内置锁 首先它是由java提供的关键synchronized来实现的,其次synchronized实现的锁在执行完修饰的代码块后自动释放锁的,相对于显示锁必须要手动释放锁所以内置锁也被成为隐式锁。 内置锁是由JVM实现的,jvm能基于synchronized锁做一些优化,比如增加锁的粒度(锁粗化)、锁消除。 内置锁的特性 相对显示锁来说,内置锁还是过重,因为内置锁是一个互斥锁,不仅...

LZ的博客 7699

Springboot + vue 实现导出word

Springboot + vue 实现导出word 后端代码 使用word先创建好已知的模板 使用word工具另存为.xml格式的文件 使用freemarker ftl模板 将修改后的xml文件复制到开发工具中,将文件后缀修改为ftl文件,并且将里面的动态值使用${}包裹例如:${zyjn} word工具类 /*** * * Project Name:maventest * <p>生成word工具类<br> * * @ClassName: WordUtil *

qq_45542373的博客 2895

【DRAM存储器四】DRAM存储器的架构演进-part1

详述以提升吞吐量为目标的DRAM架构变化

highman110的博客 1246

浅谈内置锁和显示锁

同时,除了内置锁和显示锁之外,Java还提供了其他的同步机制,例如volatile关键字、原子类、信号量等。内置锁,也称为JVM锁或者监视器锁,是Java语言提供的一种基本锁机制。4. 内置锁和显示锁都需要手动释放锁,因此在使用锁时需要注意避免出现死锁等问题。例如,可以使用Lock接口提供的tryLock()方法尝试获取锁,如果无法获取到锁则立即返回false,避免线程阻塞。为了避免死锁,可以按照一定的顺序获得锁,例如从外向内依次获取锁,或者使用tryLock()方法尝试获取锁并设置超时时间等。

qq_41194023的博客 750

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

weixin_45735391的博客 8万+

JAVA安全编码标准

以下内容摘取自《JAVA安全编码标准》,略做修改和补充解释,这是一个把书读薄和知识串通的过程 文章目录 一、输入验证和数据净化 二、声明和初始化 三、表达式 四、数值类型与运算 五、面向对象 六、方法 七、异常行为 八、可见性和原子性 九、锁 十、线程API 十一、线程池 十二、与线程安全相关的其他规则 十三、输入输出 十四、序列化 十五、平台安全性 十六、其他 一、输入验证和数据净化 1...

AlbenXie的博客 2697

SAP S/4HANA Public Cloud 的 Development Tenant 深度解析

在传统的 SAP On-Premise 版本中,企业通常拥有完整的开发、测试、生产环境,开发人员可以直接访问 ABAP 代码,进行深度定制。然而,S/4HANA Public Cloud 采用了标准化的 SaaS 模型,不允许用户直接修改核心代码。因此,SAP 提供了一种新的开发方式,即 Development Tenant,允许企业在不破坏核心系统稳定性的前提下,实现个性化扩展。Development Tenant 主要用于 SAP S/4HANA Public Cloud 的扩展开发。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 845

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+

Java内置锁的核心原理(一)

Java内置锁的核心原理 Java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程B尝试去获得线程A持有的内置锁时,线程B必须等待或者阻塞,直到线程A释放这个锁,如果A线程不释放这个锁,那么B线程将永远等待下去。 Java中每个对象都可以用做锁,这些锁成为内置锁。线程进入同步代码块或方法时会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法 线程安全问题 什么是线程安全呢?当多个线程并发访问某个Java对象(Object)

qq_57469718的博客 776

基于STM32L4XX、HAL库的ICM-42607-P姿态传感器驱动程序设计

/ 转换为dps(±1000dps量程)float accel_x = sensor_data.accel_x * (8.0f / 32768.0f);// 转换为g值(±8g量程)#define ICM42607_I2C_ADDR 0x68 << 1 // I2C地址(SA0=0)= 0x40) { // ICM-42607的WHO_AM_I值为0x40。// 读取传感器数据。

zhusl6688的博客 835

Java并发编程实战之 线程安全性、对象的共享、对象的组合

线程安全性 当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式修复这个问题: 不在线程之间共享该状态变量 将状态变量修改为不可变类型 在访问状态变量时使用同步 内置锁 Java 提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。同步代码块包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。 synchroized (lock) { // 访问或修改由锁保护的共享状态 } 每个 Java 对象都可以用做一

weixin_44593818的博客 846

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java多线程和并发编程面试题

多线程和并发编程 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成该任务只需10毫秒。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并发执行不同的任务。不同的进程使用...

baidu_28283827的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

9.Java内置锁的核心原理-Synchronized

本文深入探讨了Java内置锁(Synchronized)的核心原理。首先介绍了内置锁的基本概念,包括互斥性、可重入性、等待与通知机制以及内存可见性。然后详细解释了对象监视器、互斥性、可重入性、等待与通知机制以及内存可见性等方面的实现原理。最后,阐述了使用synchronized关键字修饰代码块或方法时的行为,以及线程在获取锁后执行被保护代码的流程。通过这些内容,读者能够深入理解Java内置锁的工作机制,从而更好地编写线程安全的Java代码。

q1372302825的博客 1260

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

多线程(二)- Java内置锁的核心原理

多线程(二)- Java内置锁的核心原理

Jerry_小蓝的博客 1133

并发编程实战--对象的共享

在之前章节我们知道对于并发程序可以确保原子性的方式来进行同步操作。但是同步是否成功还有另一个更为重要的方面:内存可见性。我们不仅希望防止某个线程使用对象状态而另一个线程在同时修改状态,而且希望确保当一个线程修改了对象的状态其他线程能够看到发生的状态变化。如果没有同步,那么这种情况就无法实现。

qq_65779957的博客 901

Java 锁相关详解【二、synchronized:Java 内置锁的全方位解析】

本文全面解析Java的synchronized关键字,涵盖其语义、实现机制、优化策略及实践要点。作为Java内置锁,synchronized通过对象头Mark Word和Monitor机制实现互斥访问和内存可见性,经历了从偏向锁到重量级锁的升级过程以提高性能。文章详细介绍了JVM层面的字节码指令、锁状态转换和优化技术(如锁消除、粗化等),并针对死锁、锁竞争等常见问题提供解决方案。最后强调在现代JDK中,经过优化的synchronized已成为安全高效的同步工具,能满足大多数并发场景需求。

NeoLshu的博客 755

Java并发编程学习——对象的共享

对象的共享线程之间对象的共享不仅仅需要有原子性和临界区,还有一个重要方面:内存可见性1 可见性读操作的线程并非可以一直获取到写线程写入的最新值,例如:代码示例 private static boolean ready; private static int number; private static class ReaderThread extends Thread {

setail的专栏 1444

Java并发编程系列5 - 对象的共享

【Java并发编程系列5】对象的共享

开心博客 349

深入解析Java多线程与并发编程(三)(Java内置锁以及synchromized线程同步机制)

Java内置锁是Java中实现线程同步的核心机制,每个对象都隐含一个锁标记,用于协调线程对共享资源的访问。synchronized关键字是实现内置锁的主要方式,可以修饰方法或代码块,确保同一时间只有一个线程执行临界区代码。synchronized方法是一种粗粒度的并发控制,而synchronized代码块则提供更细粒度的控制。Java内置锁的状态包括无锁、偏向锁、轻量级锁和重量级锁,锁会根据竞争情况升级,但不会降级。偏向锁适用于单线程重复获取锁的场景,轻量级锁通过自旋机制减少线程切换开销,而重量级锁则会在竞

wxchyy的博客 1287

Java并发编程之基础篇(二) -- 锁

Java并发编程之基础篇(二) 上一篇基础篇介绍了并发编程最基本的东西。这篇说一下多线程如何正确的访问共享可变资源。 所谓的共享可变资源就是每个线程都可以读也都可以写的资源。如何让多个线程正确的修改以及读取共享变量是一门学问。 问题引入 如下段代码实现了一个线程计数器功能,也就是统计一下有多少个线程执行了任务。 首先定义一个任务 public class Task implements Runnable { public static int count = 0; public void

IT界的一只菜鸟 276

【Java并发编程系列5】对象的共享

主要总结《Java并发编程实战》中“第3章:对象共享”的内容。 前言 在没有Java相关并发知识的前提下,第一次看这本书《Java并发编程实战》,其实有些看不太懂,因为里面的很多知识讲的比较抽象,比如可见性、volatile、final等讲的其实都不深入,所以导致自己理解的也很片面。后来就先专门看了“Java内存模型”相关的知识,再对相关知识理解起来,就要深入一些,所以才有了前面写的4篇关于“Java内存模型”相关的文章。 “第二章:基础知识”主要讲解线程安全性、原子性、加锁机制(主要讲解内置...

飞楼踏梦 171

Java并发编程深度解析

在现代软件开发中,并发编程已经成为一个不可或缺的部分。Java作为一门广泛使用的编程语言,提供了丰富的并发编程工具和库。本文将深入探讨Java中的并发模型、线程安全、锁机制以及一些高级并发工具。在Java中,并发编程的基础是线程(Thread)。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。每个对象都有一个内置锁,线程在进入同步代码块时会自动获取该锁,退出时自动释放。线程池通过复用线程来减少线程创建和销毁的开销。类提供了多种线程池的实现。接口,可以创建新的线程。

weixin_52094968的博客 2064

内置锁和重入锁

一、重入锁 Java提供了一中内置的锁机制来支持原子性:同步代码块(Synchronized Block)。同步代码块包括两部分:一个作为锁的对象引用(因为synchronized锁住的是对象),一个作为这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态static的synchroni...

懂幸福,爱生活 932
上一篇: Android不依赖Activity的全局悬浮窗实现
下一篇: 算法系列(十二)散列
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值