Java并发编程实战(1)

news/2025/2/23 1:06:13/

Java并发编程实战(1)

  • 线程安全性
    • 1、什么是线程安全?
    • 2、竞态条件
    • 内置锁
    • 重入
    • 活跃性与性能

线程安全性

1、什么是线程安全?

当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全
的。

无状态对象一定是线程安全的。

如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题:

  • 不在线程之间共享该状态变量;
  • 将状态变量修改为不可变的变量;
  • 在访问状态变量时使用同步。

2、竞态条件

当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。换句话说,就是正确的结果要取决于运气。

最常见的竞态条件类型就是“先检查后执行(Check-Then-Act)”操作,通过一个可能失效的观测结果来决定下一步的动作。

使用“先检查后执行”的一种常见情况就是延迟初始化。延迟初始化的目的是将对象的初始化操作推迟到实际被使用时才进行,同时要确保只被初始化一次。

在java.util.concurrent.atomic包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。通过用AtomicLong来代替long类型的计数器,能够确保所有对计数器状态的访问操作都是原子的。

内置锁

Java提供了一种内置的锁机制来支持原子性:同步代码块(Syncgronized Block)。

同步代码块包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。

已关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态的synchronized方法以class对象作为锁。

每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视锁(Monitor Lock)。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

Java的内置锁相当于一个互斥体(或互斥锁),这意味着最多只有一个线程能持有这种锁。

重入

当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入”意味着获取锁的操作的粒度是 “线程” ,而不是“调用”。

重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程持有。当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数值置为1.如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为0时,这个锁将被释放。

重入进一步提升了加锁行为的封装性,因此简化了面向对象并发代码的开发。

活跃性与性能

当执行时间较长的计算或者可能无法快速完成的操作时(例如,网络I/O或控制台I/O),一定不要持有锁。


http://www.ppmy.cn/news/1155071.html

相关文章

基于springboot实现在线blog博客平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线blog博客平台系统演示 摘要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高&#x…

log4cpp封装成独立的类(单例模式)

一、编译安装 二、封装使用 头文件Logger.h: #ifndef DISTRIBUTED_LOGGER_H_ #define DISTRIBUTED_LOGGER_H_#include <string> #include <log4cpp/Category.hh>class Logger{ public:bool init(const std::string& log_conf_file);static Logger* instance…

PixMIM论文笔记

论文名称&#xff1a;PixMIM: Rethinking Pixel Reconstruction in Masked Image Modeling 发表时间&#xff1a;2023 年 3 月 4 日 作者及组织&#xff1a;上海人工智能实验室、西蒙菲莎大学、香港中文大学 GitHub&#xff1a;https://github.com/open-mmlab/mmselfsup/tree/d…

探讨MySql RR事务隔离级别

探讨MySql RR事务隔离级别 明白一些东西 RR解决了什么&#xff1f; RR解决了脏读的问题&#xff08;保证了在同一个事务下&#xff0c;多次读取同样的数据的结果是一致的&#xff09;&#xff0c;最大功臣就是MVCC机制。但是这也导致RR级别出现的幻读问题&#xff0c;在特定情…

【Redis】渐进式遍历

scan命令渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&#xff0c;需要执⾏多次scan。 SCAN 以渐进式的⽅式进⾏键的遍历。 SCAN…

WSL 配置 Linux

WSL 配置 Linux Windows 启动 Linux 子系统 控制面板 -> 程序和功能&#xff0c; 将 适用于 Linux 的 Windows 子系统 勾选。 安装 Terminal 在 Microsoft Store 市场上搜索 Terminal 安装 Windows Terminal。 安装 编译工具链 sudo apt update # 更新软件包 sudo apt i…

用人工智能解决巴以冲突问题

解决巴以冲突是一个非常复杂的问题&#xff0c;涉及到政治、历史、经济、文化等多个方面。虽然人工智能在许多领域发挥了巨大的作用&#xff0c;但是处理如此复杂的问题还需要人类的智慧和判断力。 然而&#xff0c;人工智能可以在某些方面提供帮助。例如&#xff0c;可以使用…

手机路径、Windows路径知识及delphiXE跨设备APP自动下载和升级

手机路径、Windows路径知识 及delphiXE跨设备APP自动下载和升级 一、APP安装程序文件版本和权限信息 1、运行时动态调用Android apk的AndroidManifest.xml获取versionName 2、运行时动态调用IOS ipa的info.plist获取CFBundleVersion &#xff08;和entitlements&#xff09…