【java并发编程的艺术读书笔记】volatile关键字介绍、与synchronized的区别

news/2024/5/17 16:17:26 标签: java, jvm, 开发语言, 并发编程, synchronized, volatile

volatile_0">volatile的简介

volatile是轻量级锁,只用来修饰变量,保证这个变量在多线程下的可见性以及一致性(一个volatile变量被线程修改时会立刻通知其他所有线程)防止指令重排序,但是并不能保证绝对的线程安全

  • volatile只能确保单个操作的可见性和禁止重排序,但在涉及多个操作的复合操作中,volatile无法保证这些操作的原子性

  • 当多个线程需要依赖某个条件进行判断和操作时,volatile 无法提供足够的原子性保证,一个线程可能会在检查某个 volatile 变量后决定执行某些操作,但在执行操作之前,其他线程可能已经修改了这个变量的值,导致线程间逻辑错误。

volatile实现原理:CAS + 总线锁

volatilesynchronized_9">volatilesynchronized的区别

  1. 粒度不同
  • volatile 关键字主要用于保证变量的可见性和禁止指令重排序,即当一个线程修改了一个 volatile 变量的值,其他线程可以立即看到这个变化。但是,volatile 并不能保证复合操作的原子性。
  • synchronized 关键字除了提供可见性外还保证了一段代码块的原子性,即一次只能有一个线程进入同步代码块,从而防止多个线程同时执行这段代码。
  1. 作用范围不同
  • volatile 用于修饰变量,用于保证对该变量的读写操作的可见性。
  • synchronized 用于修饰代码块、方法或静态方法,用于实现线程间的同步和互斥。
  1. 互斥性
  • volatile 不提供互斥性,多个线程可以同时读写一个 volatile 变量,没有限制。
  • synchronized 提供了互斥性,当一个线程进入同步代码块或方法时,其他线程将被阻塞,直到当前线程执行完毕释放锁。
  1. 适用场景不同
  • volatile 适用于那些在多线程环境下进行简单标记、状态判断等操作的情况。它通常用于控制一个变量的可见性,例如在某个标志位被设置时退出一个循环。
  • synchronized 更适用于需要保证数据一致性、复合操作的原子性,以及需要实现线程间的协调和互斥的情况。它可以用于保护共享数据,确保同一时间只有一个线程访问关键代码段。

http://www.niftyadmin.cn/n/4975009.html

相关文章

操作系统-笔记-第五章-输入输出管理

🌸章节汇总 一、第一章——操作系统的概念 二、第二章——【进程】 二、第二章——【线程】​编辑 二、第二章——【进程调度】 二、第二章——【进程同步与互斥】 二、第二章——【锁】 三、第三章——内存管理 四、第四章——文件管理 五、第五章——输入输出管理…

多态/虚函数/虚函数表

OVERVIEW 多态/虚函数/虚函数表1.虚函数引入后类发生的变化?2.虚函数表的生成时机和生成原因?3.虚函数表指针赋值的时机?4.类对象在内存中的布局?5.虚函数的工作原理和多态性的体现?6.其他问题 多态/虚函数/虚函数表 n…

windows11系统重装步骤及优化技巧

目录 目录 本文目的 Windows11介绍 Windows下载 和win10对比 重装步骤 系统设置调整 系统备份还原 C盘减肥,空间优化技巧 Java开发工具 本文目的 说明windows11的系统重装步骤,大部分步骤也适用于其他windows版本。常用软件的安装与介绍。系统…

sleep () 和 wait () 有什么区别?

在Java中,sleep() 和 wait() 是两个用于处理多线程的方法,它们具有不同的作用和用途。 sleep(): sleep() 是 Thread 类的一个静态方法,用于暂停当前线程的执行一段指定的时间。它会阻塞当前线程,不会让其他线程获得执…

Cesium 显示经纬高

文章目录 需求分析 需求 页面展示经、纬度和高 分析 html <div id"latlng_show" style"width:340px;height:30px;position:absolute;bottom:40px;right:200px;z-index:1;font-size:15px;"><div style"width:100px;height:30px;float:left;…

Leetcode-每日一题【剑指 Offer 37. 序列化二叉树】

题目 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑&#xff0c;你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 …

Spring Cache框架(缓存)

1、介绍&#xff1a; Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单加个注解&#xff0c;就能实现缓存功能。它提供了一层抽象&#xff0c;底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。 针对不同…

Effective C++条款18——让接口容易被正确使用,不易被误用(设计与声明)

前言 所谓软件设计&#xff0c;是“令软件做出你希望它做的事情”的步骤和做法&#xff0c;通常以颇为一般性的构想开始&#xff0c;最终演变成十足的细节&#xff0c;以允许特殊接口&#xff08; interfaces&#xff09;的开发。这些接口而后必须转换为C声明式。本章中我将对…