JAVA多线程之volatile 与 synchronized 的比较

本文详细解析了Java中实现线程安全的两种关键机制:volatile关键字如何确保内存可见性及synchronized关键字如何控制代码执行顺序并保证原子性。通过对比这两种机制的特点,帮助读者深入理解Java并发编程。

理解线程安全首先得从两个方面开始:执行控制内存可见

执行控制的目的是控制代码的执行顺序以及是否可以并发执行。

内存可见控制的是线程执行过程中的内存变量对于其它线程是否可见。

一.volatile关键字解决的是内存可见性问题(在任何线程中volatile修饰的变量都是同步更新的,不存在线程间值不一致

要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下:

从图中可以看出:

①每个线程都有一个自己的本地内存空间--线程栈空间???线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作

②对该变量操作完后,在某个时间再把变量刷新回主内存

volatile常用于修饰变量,且该变量能够在不同线程间共享,保证每次读到的volatile变量都是最新的修改值,但是该变量不具有原子性

二,volatile 与 synchronized 的比较

synchronized解决的是执行控制问题。synchronized关键字修饰的代码每次只能被一个线程所访问,同时会创建内存屏障,保证代码中的所有操作都会直接刷入到内存中,而不会出现线程间结果不一致。

①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法;一个是变量级,一个是类级

②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。(具有锁机制、原子性、可同步)


源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()``.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值